优先左走即:如果左边能走就向左走,如果不能走向前走,如果前不能走,向右走,如果右不能走向后走。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char e[110][110]; int n,m,flag,vis[110][110]; int dx[]={-1,0,1,0}; int dy[]={0,-1,0,1}; int fun(char c){ if(c=='N') return 0; if(c=='W') return 1; if(c=='S') return 2; return 3; } int insert(int a,int b){ if(a>=1 && a<=n && b>=1 && b<=m && e[a][b]!='#') return true; return false; } void dfs(int x1,int y1,int d){ if(flag) return ; for(int i=1;i>-3;i--){ int ds=(d+i+8)%4; int xx=x1+dx[ds]; int yy=y1+dy[ds]; if(insert(xx,yy)){ if(e[xx][yy]=='X'){ flag=1; return; } if(vis[xx][yy]==4) return; vis[xx][yy]++; dfs(xx,yy,ds); return; } } } int main(){ int startx,starty; while(cin >> n >> m){ char c; flag=0; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin >> e[i][j]; if(e[i][j]=='T'){ startx=i;starty=j; } } } cin >> c; int d=fun(c); vis[startx][starty]=1; dfs(startx,starty,d); if(flag) cout<<"YES" <<endl; else cout <<"NO" <<endl; } return 0; }