随笔分类 - dfs
摘要:题目大意是要求小狗在指定的时间恰好到达D点。由于不是求最短路线,故用DFS要简单。题目难点就是剪枝了:1.记录可行的个数,如果可行点比指定的时间还短,那么是肯定到不了的,可以剪去。2.奇偶剪枝,具体原理见链接:http://blog.csdn.net/chyshnu/article/details/6171758AC code:View Code 1 #include <iostream> 2 #include <math.h> 3 using namespace std; 4 int ln, col, time; 5 int sx, sy, ex, ey, ok, a
阅读全文
摘要:这一题综合了DFS和DP,很好的一道题。dp[i][j]表示以第i行第j列个网格为起点所能得到的最大值,需要注意的是一次最多走k步必须在一条直线上,这个只需要在普通的深搜上加一层循环表示从1步到k步,状态转移就是dp[i][j] = max{dp[i + d1*c][j + d2*c], 1=< c <= k} + map[i][j]。AC code:View Code 1 #include<iostream> 2 using namespace std; 3 4 int a[101][101]; 5 int dp[101][101]; //dp[i][j]表示从位置(
阅读全文
摘要:这一题感觉是深搜的思路比较好想,不过容易超时,必须加些剪枝。广搜的话思路比较难想,代码也挺复杂的,我一直没编对,所以这里只有深搜的代码~剪枝策略:1.首先判断两点是否相等,最基础的剪枝;2.判断起始点是否为0,为0直接输出NO;3.当当前的路线转折数已经到2时,判断当前点与终点的横纵坐标是否至少有一个相等,如果都不相等则剪去;AC code:View Code 1 #include <iostream> 2 #define MAX 1001 3 using namespace std; 4 int n, m; 5 int map[MAX][MAX]; 6 bool vis[MAX]
阅读全文
摘要:这题就是比较水的一道搜索题了,BFS跟DFS都能做,直接看代码吧!AC code:View Code 1 #include <iostream> 2 #define MAX 50 3 using namespace std; 4 int w, h; 5 char map[MAX][MAX]; 6 int dir[][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; 7 int count; 8 bool inmap(int x,int y) 9 {10 return x >= 0 && x < h && y
阅读全文
摘要:题目大意是找到独立的油田个数,所谓独立就是跟它相邻的八个方向上都不能再有别的油田。思路就是每遇到一个'@'都要将它周围的所有'@'都给改成'*',用DFS跟BFS都可以,这里是DFS的代码:AC code:View Code 1 #include <iostream> 2 #define MAX 101 3 using namespace std; 4 int m, n, count; 5 char map[MAX][MAX]; 6 int dir[8][2] = {{0, 1}, {0, -1}, {1, 0},{-1, 0}, {
阅读全文
摘要:这一题是比较麻烦的深搜加广搜的题,考察范围较广,题目大意是从起点出发分别找出左贴墙走、右贴墙与正常走到终点的最短路程。很自然联想到用广搜解决正常走的最短路径,用深搜解决另两种最短路程。难点是如何解决深搜时的方向问题,由于不会用C++提供的STL中德队列类,所以就自己写的,比较麻烦,不过思路应该还算清晰吧。AC代码如下:#include <iostream>#define MAX 100#define MAXN 10000using namespace std;char map[MAX][MAX];int vis[MAX][MAX];int dir1[4][2]={{0,-1},{1
阅读全文
摘要:题目大意是:乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。看到这道题首先想到的就是暴力法枚举。枚举原始长度dfs判断该长度是否可以由小木棒组合而成。不过直接这样肯定超时,自然想到要添加剪枝;剪枝策略:1、已知木棒总长度sum,原始木棒长度L一定满足sum%L = 0;2、将木棒从大到小排序,因为越长的木棒对后面的约束越大;3、当一根木棒搜索失败时,跳过与它相同长度的;4、
阅读全文
摘要:1 #include <iostream> 2 #define MAX 10 3 using namespace std; 4 char a[MAX][MAX]; 5 int tot , n, k; 6 bool vis[MAX];//用于记录某一列上是否已摆过棋子 7 void dfs(int cur, int num)//深搜开始 8 { 9 if(num == k)10 {11 tot ++;//得到一种情况12 return;13 }14 if(cur == n)15 return;16 for(...
阅读全文