再加一个自己写的bfs
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <vector> 7 #include <stack> 8 #include <queue> 9 #include <cassert> 10 #include <set> 11 #include <sstream> 12 #include <map> 13 using namespace std ; 14 #ifdef DeBUG 15 #define bug assert 16 #else 17 #define bug // 18 #endif 19 #define zero {0} 20 #define MAXNUM 99999999 21 int dir[4][2]={0,1,0,-1,1,0,-1,0}; 22 int n,m; 23 int i,j,k; 24 int _flag=0; 25 int xs,ys,x2,y2; 26 int a[1001][1001]=zero; 27 int visited[1001][1001]=zero; 28 void dfs(int x,int y,int di) 29 { 30 if(_flag) 31 return; 32 if (x !=x2 && y != y2 && visited[x][y] == 2)//别看就这两行,效率提高的不是一点两点,去掉后4234msA,加上140ms 33 return ;//横纵坐标都不一样说明还得再转,但是已不能转 34 if(visited[x][y]>2)//转弯多了 35 return ; 36 if(visited[x][y]<=2&&x==x2&&y==y2)//成功 37 { 38 _flag=1; 39 return; 40 } 41 for(int i=0;i<4;i++) 42 { 43 int tx=x+dir[i][0]; 44 int ty=y+dir[i][1]; 45 if(tx<=0||ty<=0||tx>n||ty>m)//出界剪枝 46 continue; 47 if(visited[tx][ty]<visited[x][y])//下一步要走的弯数小了似乎都要剪掉 48 continue; 49 if((di!=i&&di!=-1)&&visited[tx][ty]<visited[x][y]+1)//有转弯情况时,原因同上 50 continue; 51 if((a[tx][ty]!=0&&(tx!=x2||ty!=y2))||(a[tx][ty]!=0&&(tx!=x2||ty!=y2))) 52 continue;//下一步不是0,不能联通,但此点不是终点或始点,逻辑问题绕我半天 53 visited[tx][ty]=visited[x][y];//下步的弯数 54 if(di!=i&&di!=-1)//有转弯情况加上 55 visited[tx][ty]++; 56 dfs(tx,ty,i);//搜 57 if(_flag)//还是剪枝 58 return; 59 // visited[tx][ty]=MAXNUM;//这样可以把失败时的visited复原,类似8皇后 60 } 61 } 62 int main() 63 { 64 #ifdef DeBUG 65 freopen("C:\\Users\\Sky\\Desktop\\1.in","r",stdin); 66 #endif 67 68 69 while(scanf("%d%d",&n,&m),n!=0&&m!=0) 70 { 71 memset(a,0,sizeof(a)); 72 for(i=1;i<=n;i++) 73 { 74 for(j=1;j<=m;j++) 75 { 76 scanf("%d",&a[i][j]); 77 } 78 } 79 int T; 80 81 scanf("%d",&T); 82 while(T--) 83 { 84 _flag=0; 85 for(i=1;i<=n;i++) 86 { 87 for(j=1;j<=m;j++) 88 { 89 visited[i][j]=MAXNUM; 90 } 91 } 92 scanf("%d%d%d%d",&xs,&ys,&x2,&y2); 93 if(a[xs][ys]!=a[x2][y2]||(xs==x2&&ys==y2)||!a[xs][ys]||!a[x2][y2]) 94 { 95 printf("NO\n"); 96 continue;//剪枝,你懂得 97 } 98 visited[xs][ys]=0; 99 dfs(xs,ys,-1); 100 if(_flag) 101 printf("YES\n"); 102 else 103 printf("NO\n"); 104 } 105 } 106 return 0; 107 } View Code
转载于:https://www.cnblogs.com/Skyxj/p/3195601.html
相关资源:数据结构—成绩单生成器