Salvation -- ---广搜 + 限定方向 ,
这个欣求 , 在迷宫里密室了方向 , 走过了一个地方 不做标记 还一个劲 , 找不到媳妇不亏 .
这个题 我跳了两个坑 , 1 : 习惯性添加标记走过的 位置 ,导致所有的位置都能 走过一遍 , 2 : 转弯的时候 变换面部朝向
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> #include<stack> #include<string> #include<sstream> #include<map> #include<cctype> using namespace std; char a[105][105],T; int b[4][2]={-1,0,0,-1,1,0,0,1},n,m,t,time1[105][105],mark/*,visited[105][105]*/; //按照 左上右下的顺序 void DFS(int x,int y,int q) { for(int i=0;i<4&&time1[y][x]<4&&!mark;i++) //同一个点最多前后左右四次 { time1[y][x]++; int ac=(i+q)%4; if(!mark&&x+b[ac][0]>=0&&y+b[ac][1]>=0&&y+b[ac][1]<n&&x+b[ac][0]<m&&a[y+b[ac][1]][x+b[ac][0]]!='#'/*&&!visited[y+b[ac][1]][x+b[ac][0]]*/) { // visited[y+b[ac][1]][x+b[ac][0]]=1; if(a[y+b[ac][1]][x+b[ac][0]]=='X') { mark=1; break; } a[y+b[ac][1]][x+b[ac][0]]='@'; DFS(x+b[ac][0],y+b[ac][1],q); return ; // 因为会 迷失方向 所以 一条路走到底 之后 没路走了 ( 进了死胡同 ) // visited[y+b[ac][1]][x+b[ac][0]]=0; // 就 直接去死吧 . } } } int main() { int x,y; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf(" %c",&a[i][j]); if(a[i][j]=='T') { x=j; y=i; } } } scanf(" %c",&T); switch(T) { case'N':t=0;break; // 面朝北的话 向左走 case'S':t=2;break; case'W':t=3;break; case'E':t=1;break; } memset(time1,0,sizeof(time1)); // memset(visited,0,sizeof(visited)); mark=0; DFS(x,y,t); if(mark) printf("YES\n"); else printf("NO\n"); } return 0; }