dfs

dfs+染色 练习题

ⅰ亾dé卋堺 提交于 2020-02-13 02:04:28
dfs+染色 练习题 POJ - 1979 Red and Black 点击进入原题 ####个人觉得这道题其实就是要算连续的 ‘.’ 的个数,然后有 ‘#’ 阻挡了。 ####思路:搜索@确定开始的位置,把@变为 ’#‘;然后查找四个方向找 ‘.’ 并逐个变为 ’#‘ ; 定义全局变量按时加以计数,最后打印出答案,emmm因为有可能出现多个例子所以ans得记得初始化为0; # include <iostream> using namespace std ; int w , h , ans = 0 ; char a [ 21 ] [ 21 ] ; void dfs ( int i , int j ) { a [ i ] [ j ] = '#' ; ans ++ ; //查找四个方向 if ( a [ i + 1 ] [ j ] == '.' && ( i + 1 ) < w ) dfs ( i + 1 , j ) ; if ( a [ i - 1 ] [ j ] == '.' && ( i - 1 ) >= 0 ) dfs ( i - 1 , j ) ; if ( a [ i ] [ j + 1 ] == '.' && ( j + 1 ) < h ) dfs ( i , j + 1 ) ; if ( a [ i ] [ j - 1 ] == '.' && ( j - 1 ) >=

图算法

萝らか妹 提交于 2020-02-12 17:37:05
一.无向图 1.邻接表数据结构 1) 图中顶点用一个一维数组存储,当然也可以用单链表来存储,不过用数组可以较容易的读取顶点信息,更加方便。另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。 2) 图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图则称为以vi为弧尾的出边表。 package sort; import edu.princeton.cs.algs4.Bag; import edu.princeton.cs.algs4.In; import edu.princeton.cs.algs4.StdOut; import java.util.NoSuchElementException; import java.util.Stack; public class Graph { private static final String NEWLINE = System.getProperty("line.separator"); private final int V; private int E; private Bag<Integer>[] adj; //创建一个含有V个顶点但不含有边的图 public Graph(int V) { if (V < 0) throw

数位dp入门学习之路(正常枚举“过渡到”dfs枚举)

二次信任 提交于 2020-02-12 14:57:24
前言 :数位dp就是换一种穷举方式。额......我第一次看这句话也懵,哎,资深学渣,来记个笔记先。 正常枚举“过渡到”dfs枚举(这里暂时是穷举的数为:1、10、100、1000、10000....,要穷举任意数在后面给出) 其实有些兄弟用了递推关系来做这类题,但个人感觉那种解题方式还是太花时间了。。。。。。。。。。 正常枚举: #include <iostream> #include <cstdio> #define ll long long using namespace std; int main() { for (int i = 0; i <= 1000) { printf("%d\n", i); } return 0; } 结果:略(看数学答案也是这样) dfs枚举:注意pos参数的意思是枚举到当前数字的位数。dfs是从数字的高位往低位枚举(当数字的枚举是也是从小到大的)。num用于记录当前枚举的数字 dfs(pos=0, num); 表示只枚举长度为1的数字,最大数为9 dfs(pos=1, num); 表示只枚举长度为2的数字,最大数为99 dfs(pos=2, num); 表示只枚举长度为3的数字,最大数为999 最好自己动手测一下其他结果,不要光靠脑袋想,除非...........哈哈 #include <iostream> #include <cstdio>

3000米排名预测 DFS 全排列函数next_permutation

北城余情 提交于 2020-02-12 14:33:37
问题 1478: [蓝桥杯][算法提高VIP]3000米排名预测 时间限制: 1Sec 内存限制: 128MB 提交: 167 解决: 54 题目描述 3000米长跑时,围观党们兴高采烈地预测着 最后的排名。因为他们来自不同的班,对所有运动员不一定都了解,于是他们分别对自己了解的一些运动员的实力作出了评估,即对部分运动员做了相对排名的预 测,并且告诉了可怜留守的班长。因为无聊,于是他们就组团去打Dota去了。比赛结束后他们向班长询问最后的排名,但班长不记得了,只记得他们中哪些人的 预测是正确的,哪些人的预测是错误的。他们想知道比赛的排名可能是什么。 数据规模和约定 1< =n< =10, 2< =c< =n, 1< =m< =10,保证数据合法,且答案中排名可能数不超过20000。对于一个排名序列,一个预测是正确的,当且仅当预测的排名的相对顺序 是排名序列的一个子序列。一个预测是错误的,当且仅当这个预测不正确。 输入 第一行两个整数n, m,n为运动员数量,m为围观党数量。运动员编号从0到n-1。 接下来m行,每行为一个围观党的相对排名预测。每行第一个数c表示他预测的人数,后面跟着c个0~n-1的不同的数,表示他预测的运动员相对排名,最后还有一个数,0表示这个预测是错误的,1表示是正确的。 输出 第一行一个数k为有多少种排名的可能。 下面k行,每行一个0~n-1的排列

求水洼(dfs)

↘锁芯ラ 提交于 2020-02-12 13:28:59
在余队长众多的农场中,有这样一片N*M大小的田地,它在下雨后积起了水。 在他的田地中,'W'代表积水,'.'代表土地,一片相互连接的积水叫做“水WA”。(每个格子被认为和相邻的8个格子相连) 现在农场工作人员传回来了田地的航拍图,余队长让你帮他确定有多少个“水WA”。 Input * Line 1: N 和 M * Lines 2..N+1: M个字符一行,每个字符代表余队的农场的土地情况。每个字符中间不包含空格 Output * Line 1: "水WA"的数量 dfs #include<cstdio> #include<iostream> using namespace std; int n,m; char p[150][150]; int dx[]={0,0,-1,1,1,1,-1,-1}; int dy[]={-1,1,0,0,-1,1,-1,1}; void dfs(int x,int y) { p[x][y]='.'; for(int i=0;i<8;i++) { int gx=x+dx[i]; int gy=y+dy[i]; if(gx>=0&&gx<=n&&gy>=0&&gy<=m&&p[gx][gy]=='W') { dfs(gx,gy); } } } int main() { cin>>n>>m; for(int i=0;i<n;i++) cin>>p[i];

hdu 1716 排列2(DFS搜索)

我的未来我决定 提交于 2020-02-12 03:08:51
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1716 排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5692 Accepted Submission(s): 2178 Problem Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。 Input 每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。 Output 对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在同一行,同一行中每个四位数间用空格分隔。 每组输出数据间空一行,最后一组数据后面没有空行。 Sample Input 1 2 3 4 1 1 2 3 0 1 2 3 0 0 0 0 Sample Output 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321

剑指offer-二叉树中和为某一值的路径

十年热恋 提交于 2020-02-11 09:34:11
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 使用dfs 1 public class Solution {//dfs 树 my 2 ArrayList<ArrayList<Integer>> re ; 3 public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { 4 re = new ArrayList<>(); 5 if(root!=null){ 6 dfs(root,new ArrayList<Integer>(),target,0); 7 } 8 return re; 9 } 10 public void dfs(TreeNode root ,ArrayList<Integer> list,int target,int sum){ 11 if(root.left==null&&root.right==null){ 12 if((sum+root.val)==target){ 13 //添加路径 14 ArrayList l =new ArrayList<Integer>(list); 15 l.add(root.val)

AcWing 524 愤怒的小鸟

狂风中的少年 提交于 2020-02-11 06:44:41
题目描述: Kiana最近沉迷于一款神奇的游戏无法自拔。   简单来说,这款游戏是在一个平面上进行的。  有一架弹弓位于 (0, 0) 处,每次Kiana可以用它向第一象限发射一只红色的小鸟, 小鸟们的飞行轨迹均为形如 y = ax^2 + bx 的曲线,其中 a, b 是Kiana指定的参数,且必须满足 a < 0 。 当小鸟落回地面(即 x 轴)时,它就会瞬间消失。 在游戏的某个关卡里,平面的第一象限中有 n 只绿色的小猪,其中第 i 只小猪所在的坐标为 (xi, yi) 。  如果某只小鸟的飞行轨迹经过了 (xi, yi) ,那么第 i 只小猪就会被消灭掉,同时小鸟将会沿着原先的轨迹继续飞行;  如果一只小鸟的飞行轨迹没有经过 (xi, yi) ,那么这只小鸟飞行的全过程就不会对第 i 只小猪产生任何影响。  例如,若两只小猪分别位于 (1, 3) 和 (3, 3) ,Kiana可以选择发射一只飞行轨迹为 y = −x^2 + 4x 的小鸟,这样两只小猪就会被这只小鸟一起消灭。  而这个游戏的目的,就是通过发射小鸟消灭所有的小猪。  这款神奇游戏的每个关卡对Kiana来说都很难,所以Kiana还输入了一些神秘的指令,使得自己能更轻松地完成这个这个游戏。    这些指令将在输入格式中详述。  假设这款游戏一共有 T 个关卡,现在Kiana想知道,对于每一个关卡

POJ-1426-Find The Multiple(DFS)

穿精又带淫゛_ 提交于 2020-02-10 20:23:25
Find The Multiple Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100 decimal digits. Input The input file may contain multiple test cases. Each line contains a value of n (1 <= n <= 200). A line containing a zero terminates the input. Output For each value of n in the input print a line containing the corresponding value of m. The decimal representation of m must not contain more than 100 digits.

P1036 选数(DFS)

北城余情 提交于 2020-02-10 20:12:52
P1036 选数 题目描述 已知 n个整数 x1,x2,…,xn,以及11个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34。 现在,要求你计算出和为素数共有多少种。 例如上例,只有一种的和为素数:3+7+19=29。 输入格式 键盘输入,格式为: n,k1≤ n ≤20, k < n ) x 1, x 2,…,*x**n*(1≤xi≤5000000) 输出格式 屏幕输出,格式为: 1个整数(满足条件的种数)。 输入输出样例 输入 4 3 3 7 12 19 输出 1 题解 因为n<=20,所以可以放心地DFS。因为要遍历每个数的选与不选,所以共有O(2^n^)的复杂度2^20^(1m)约为1e6,能过。 又因为sum最多是20*5e6=1e8,可以不用ll(我比较谨慎,所以开了ll) 真正要判断是否为质数的情况就是C(n,k),最差的时候n为20,k为10,方案数约有1.847e5种。 Judge函数为O(根号sum),sum最大为1e8,这时复杂度为1e4,如果执行1.847e5次就是1.847e9的复杂度。 综上所述,判断质数的总复杂度才是程序的主要复杂度。 这样写,虽然有些危险