那些操蛋的搜索题目:逃离迷宫&&哈密顿绕行世界问题
坐标类型搜索 :这种类型的搜索题目通常来说简单的比较简单,复杂的通常在边界的处理和情况的讨论方面会比较复杂,分析这类问题,我们首先要抓住题目的意思,看具体是怎么建立坐标系(特别重要),然后仔细分析到搜索的每一个阶段是如何通过条件转移到下一个阶段的。确定每一次递归(对于DFS)的回溯和深入条件,对于BFS,要注意每一次入队的条件同时注意判重。要牢牢把握目标状态是一个什么状态,在什么时候结束搜索。还有,DFS过程的参数如何设定,是带参数还是不带参数,带的话各个参数一定要保证能完全的表示一个状态,不会出现一个状态对应多个参数,而这一点对于BFS来说就稍简单些,只需要多设置些变量就可以了。
数值类型搜索:(虽然我也不知道该怎么叫,就起这个名字吧),这种类型的搜索就需要仔细分析分析了,一般来说采用DFS,而且它的终止条件一般都是很明显的,难就难在对于过程的把握,过程的把握类似于坐标类型的搜索(判重、深入、枚举),注意这种类型的搜索通常还要用到剪枝优化,对于那些明显不符合要求的特殊状态我们一定要在之前就去掉它,否则它会像滚雪球一样越滚越大,浪费我们的时间。
解释我都不想打了:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 int a[22][4],m,h,b[25],map1[22]; 7 void dfs(int x,int t) 8 { 9 int i,j,sx; 10 if(t==20 &&( a[x][1] == m || a[x][2] == m || a[x][3] == m )) 11 { 12 ++h; 13 printf("%d: ",h); 14 for(i=0;i<20;i++) 15 printf(" %d",b[i]); 16 printf(" %d\n",m); 17 } 18 for(j=1;j<=3;j++) 19 { 20 sx=a[x][j]; 21 if(map1[sx]==0) 22 { 23 map1[sx]=1; 24 b[t]=sx; 25 dfs(sx,t+1); 26 map1[sx]=0; 27 } 28 } 29 } 30 int main() 31 { 32 int i,j; 33 for(i=1;i<=20;i++) 34 for(j=1;j<=3;j++) 35 scanf("%d",&a[i][j]); 36 while(scanf("%d",&m)!=EOF) 37 { 38 if(m==0) break; 39 memset(map1,0,sizeof(map1)); 40 map1[m]=1; 41 h=0;b[0]=m;dfs(m,1); 42 } 43 return 0; 44 }
不解释:参见:http://www.cnblogs.com/qiufeihai/archive/2012/08/27/2659159.html
1 #include <iostream> 2 #include <queue> 3 #include<stdio.h> 4 #include<string.h> 5 using namespace std; 6 7 const int M = 111; 8 9 int n, m; 10 int max_turn; 11 int star_x, star_y, end_x, end_y; 12 char g[M][M]; 13 bool vis[M][M]; 14 int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; 15 //右,下,左,上 16 17 18 struct Node 19 { 20 int x, y; 21 int turn_num; 22 23 }; 24 25 int Bfs() 26 { 27 queue <Node> q; 28 Node q1; 29 q1.x = star_x; 30 q1.y = star_y; 31 q1.turn_num = -1; 32 q.push(q1); 33 vis[star_x][star_y] = 1; 34 35 while (!q.empty()) 36 { 37 Node q2 = q.front(); 38 q.pop(); 39 40 if (q2.x == end_x && q2.y == end_y && q2.turn_num <= max_turn) 41 { 42 return 1; 43 } 44 45 q1.turn_num = q2.turn_num + 1; 46 47 for (int i = 0; i < 4; i++) 48 { 49 q1.x = q2.x + dir[i][0]; 50 q1.y = q2.y + dir[i][1]; 51 while (q1.x >= 1 && q1.x <= n && q1.y >= 1 && q1.y <= m && g[q1.x][q1.y] == '.'/* && !vis[q1.x][q1.y]*/)//********** 52 { 53 if (!vis[q1.x][q1.y])//********************************* 54 { 55 q.push(q1); 56 vis[q1.x][q1.y] = 1; 57 } 58 q1.x += dir[i][0]; 59 q1.y += dir[i][1]; 60 } 61 } 62 63 } 64 return 0; 65 } 66 67 int main() 68 { 69 int t; 70 scanf("%d", &t); 71 while (t--) 72 { 73 scanf("%d%d", &n, &m); 74 for (int i = 1; i <= n; i++) 75 { 76 for (int j = 1; j <= m; j++) 77 { 78 scanf(" %c", &g[i][j]); 79 } 80 } 81 82 scanf("%d%d%d%d%d", &max_turn, &star_y, &star_x, &end_y, &end_x); 83 84 memset(vis, 0, sizeof(vis)); 85 86 87 88 if (Bfs()) 89 { 90 puts("yes"); 91 } 92 else 93 { 94 puts("no"); 95 } 96 } 97 return 0; 98 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步