dfs

DFS之剪枝与优化-------木棒

℡╲_俬逩灬. 提交于 2020-03-02 04:04:57
题目大意:n跟木棍,可以拼接成相同长度的最小长度的木棒,问长度是多少 思路:枚举每根木棒 1.优化搜索顺序:从大到小枚举木棍长度 2.只枚举长度是总和的约数 3.按照组合数枚举 4.如果当前木棍加到木棒中失败了,则直接略过所有长度相等的木棍 5.如果木棍第一根失败,则一定失败 6.若最后一根失败,则一定失败 ac代码如下: # include <iostream> # include <algorithm> # include <cstring> using namespace std ; const int N = 70 ; int n ; int w [ N ] ; int sum , length ; bool st [ N ] ; bool dfs ( int u , int cur , int start ) { if ( u * length == sum ) return true ; if ( cur == length ) return dfs ( u + 1 , 0 , 0 ) ; for ( int i = start ; i < n ; i ++ ) { if ( st [ i ] || cur + w [ i ] > length ) continue ; st [ i ] = true ; if ( dfs ( u , cur + w [ i ] , i

欧拉回路/欧拉路径求解,Fleury算法,Hierhoizer算法

随声附和 提交于 2020-03-02 00:50:00
欧拉路径就是一笔画问题,在一个连通图中,一笔走完所有路径不能有重复路径。 无向图: 具有欧拉回路的 充要条件 图连通,所有点的度数为偶数 具有欧拉路径的 充要条件 图连通,具有0个或者2个奇数度数的结点 有向图: 具有欧拉回路的 充要条件 图连通,所有点的入度等于出度 具有欧拉路径的 充要条件 图连通,一个点的出度大入度1度,一个点的入度大于出度1度,其余点出度等于入度。 Fleury算法跟Hierhoizer算法很相似,但是Hierhoizer算法更快一点,遍历一遍图就可以了。 我感觉核心思想就是圈套圈,有欧拉回路的图可以抽象为很多圈套在一起,试想一下给你很多圈相切的图形,你该如何一笔画?当然是遇到切点就进入切点的园中继续走遇到切点就走。 Hierhoizer算法的思想就是如此。寻找欧拉回路的时候正确的起点出发,遍历该节下一个结点,然后删除此边重复此步骤,在一个存在欧拉路径的路中会找到一个环,然后用一个stack存储路径,从递归深处存储,遇到还有为访问完路径的结点就继续访问,这等价于全是园的图中遇到切点,我们就进入切点继续访问。 看代码辅助理解一下: vector < int > G [ 10000 ] ; //邻接表存图 int nums [ 1000 ] [ 1000 ] ; //存边的条数 stack < int > path ; void dfs ( int s ) {

DFS(深度优先搜索算法)入门理解和搜索路径详解

痴心易碎 提交于 2020-03-01 12:57:14
基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。 搜索思想 深搜的思想就是一搜到底,而且已经搜索过的路径标记下来,不会重复搜索,如果一条路径的搜索不动了,那就退回,换一条路径搜索,知道所有的情况都搜索完。 基本模板 void dfs(int step) { 判断边界 尝试每一种可能 for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 搜索过程 深搜的思想就是一搜到底,如果搜索不动了,就退回换一条路径继续搜索,下面来看一个例子的搜索路径 例子的起始位置的(0,0),在一个九宫格内进行搜索。 #include<iostream> using namespace std; int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int book[3][3]={0}; int next[4][2]={0,1,1,0,0,-1,-1,0};//搜索顺序右下左上 int sum=0; void dfs(int x,int y,int step,string s) { if(step=

蓝桥杯---FJ的字符串---DFS+记忆化

梦想与她 提交于 2020-03-01 11:11:03
试题 基础练习 FJ的字符串 资源限制   时间限制:1.0s 内存限制:512.0MB 问题描述   FJ在沙盘上写了这样一些字符串:   A1 = “A”   A2 = “ABA”   A3 = “ABACABA”   A4 = “ABACABADABACABA”   … …   你能找出其中的规律并写所有的数列AN吗? 输入格式   仅有一个数:N ≤ 26。 输出格式   请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。 样例输入 3 样例输出 ABACABA 实现代码 # include <iostream> # include <string> # include <cstring> using namespace std ; int n ; char a [ 26 ] ; string ans [ 26 ] ; string dfs ( int n ) { if ( ans [ n ] . length ( ) ) return ans [ n ] ; if ( n == 0 ) return ans [ 0 ] = a [ 0 ] ; else return ans [ n ] = dfs ( n - 1 ) + a [ n ] + dfs ( n - 1 ) ; } int main ( ) { for ( int i = 0 ;

结合dfs的记忆搜索

家住魔仙堡 提交于 2020-03-01 07:45:34
记忆搜索 在一些图形问题中,我们会重复用到同一个点的值,我们不需要每次都去递归出这个值是多少,我们用一个数组将这个值保存下来,实现记忆 P1434 这个题直接用dfs会有一组数组TLE,一定要用记忆搜索 # include <bits/stdc++.h> using namespace std ; int a [ 105 ] [ 105 ] ; //高度地图 int maxx = 0 ; //输出的最大值 int lenth [ 105 ] [ 105 ] ; //记录每一个点开始滑行的最远距离 int fxx [ 5 ] = { 0 , 0 , 0 , 1 , - 1 } ; //方向数组 int fxy [ 5 ] = { 0 , 1 , - 1 , 0 , 0 } ; //方向数组 int n , m ; int dfs ( int nowi , int nowj ) ; //深搜加记忆,返回一个int,指这个点开始滑行的最远距离 int main ( ) { scanf ( "%d%d" , & n , & m ) ; for ( int i = 1 ; i <= n ; i ++ ) { for ( int j = 1 ; j <= m ; j ++ ) { scanf ( "%d" , & a [ i ] [ j ] ) ; } } for ( int i = 1 ;

 蓝桥——2n皇后问题(dfs)

流过昼夜 提交于 2020-03-01 03:17:19
2n皇后问题 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述   给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。 输入格式   输入的第一行为一个整数n,表示棋盘的大小。   接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。 输出格式   输出一个整数,表示总共有多少种放法。 样例输入 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 样例输出 2 样例输入 4 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 样例输出 0 好久没刷题了。 之前练习的都是摆放一种棋子,这个题第一次见,摆放两种棋子。 思路:先摆放完白棋,再摆放黑棋。 #include <bits/stdc++.h> using namespace std; int n;// 皇后数目 int mapp[10][10]; int white[10], black[10]; // white[i] 第i个皇后放在 white列 int ans = 0; //答案 //pos 行代表正在放第 pos+1 个皇后

竞赛题笔记(一):凑算式

天涯浪子 提交于 2020-02-29 16:57:14
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。 比如: 6+8/3+952/714 就是一种解法, 5+3/1+972/486 是另一种解法。 这个算式一共有多少种解法? Python解法1,递归溢出: def connect_int(i1,i2,i3): return int(str(i1)+str(i2)+str(i3)) def dfs(nums=[]): if len(nums)==9: if nums[0]+nums[1]/nums[2]+connect_int(nums[3],nums[4],nums[5])/connect_int(nums[6],nums[7],nums[8])==10: global count count+=1 print(nums) for i in range(1,10): nums.append(i) dfs(nums) nums.pop() count=0 dfs() print(count) 来源: https://www.cnblogs.com/shitianfang/p/12383585.html

nyoj-27-水池数目

我与影子孤独终老i 提交于 2020-02-28 21:40:39
1 // 题目地址: http://acm.nyist.net/JudgeOnline/status.php?pid=27 2 // 解题思路:裸的dfs, 遍历每个格子dfs访问当前格子的相领格子 3 #include <stdio.h> 4 #include < string .h> 5 6 int map[ 110 ][ 110 ], vis[ 110 ][ 110 ]; 7 int dx[ 4 ] = { 0 , 0 , - 1 , 1 }; 8 int dy[ 4 ] = {- 1 , 1 , 0 , 0 }; 9 10 void dfs( int x, int y){ 11 int i; 12 if (map[x][y] == 0 || vis[x][y] == 1 ) return ; // 访问过,或者不存在水池则返回 13 vis[x][y] = 1 ; 14 for (i = 0 ; i < 4 ; i++){ 15 dfs(x + dx[i], y + dy[i]); 16 } 17 // dfs(x - 1, y); 18 // dfs(x +1, y); 19 // dfs(x, y - 1); 20 // dfs(x, y + 1); 21 } 22 23 int main(){ 24 int t, n, m, i, j; 25 int ans; 26

水池数目(DFS)

让人想犯罪 __ 提交于 2020-02-28 21:40:10
水池数目 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池,0表示此处是地面) 输出 输出该地图中水池的个数。 要注意,每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。 样例输入 2 3 4 1 0 0 0 0 0 1 1 1 1 1 0 5 5 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 样例输出 2 3 1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int a,m,n; 5 int ma[110][110],vis[110][110]; 6 void dfs(int x,int y) 7 { 8 if(x<0||y<0||x==m||y==n||!ma[x][y]||vis[x]

dfs部分和

雨燕双飞 提交于 2020-02-28 15:17:34
题目描述 给定整数序列a1,a2,…,an,判断是否可以从中选出若干数,使它们的和恰好为k. 1 ≤n≤ 20 - 10 ^ 8 ≤ai≤ 10 ^ 8 - 10 ^ 8 ≤k≤ 10 ^ 8 样例:输入 n = 4 a = { 1 , 2 , 4 , 7 } k = 13 输出: Yes ( 13 = 2 + 4 + 7 ) 解法一 import javafx . scene . transform . Scale ; import java . util . ArrayList ; import java . util . Scanner ; public class dfs_ 部分和 { static void dfs ( int [ ] a , int k , int cur , ArrayList < Integer > ints ) { if ( k == 0 ) { System . out . println ( "YES" ) ; System . exit ( 0 ) ; } if ( cur == a . length || k < 0 ) { return ; } dfs ( a , k , cur + 1 , ints ) ; ints . add ( a [ cur ] ) ; int index = ints . size ( ) - 1 ; dfs