http://codeforces.com/contest/793/problem/B
题意:
一个地图,有起点和终点还有障碍点,求从起点出发到达终点,经过的路径上转弯次数是否能不超过2。
思路:
直接dfs,但是要优化一下,用vis[x][y][dir]来记录在(x,y)并且方向为dir时的最少转弯数,这样在dfs的时候可以剪掉一些不符合的情况。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 using namespace std; 11 typedef long long LL; 12 const int inf=0x3f3f3f3f; 13 const int maxn=1000+5; 14 15 int n,m; 16 int sx,sy; 17 int flag; 18 char g[maxn][maxn]; 19 int vis[maxn][maxn][5]; 20 21 int dx[]={0,0,1,-1}; 22 int dy[]={1,-1,0,0}; 23 24 void dfs(int x,int y,int dir,int turn) 25 { 26 if(flag) return; 27 if(turn>2) return; 28 if(vis[x][y][dir]<=turn) return; //优化 29 if(g[x][y]=='T') 30 { 31 if(turn<=2) flag=1; 32 return; 33 } 34 vis[x][y][dir]=turn; 35 for(int k=0;k<4;k++) 36 { 37 int xx=x+dx[k]; 38 int yy=y+dy[k]; 39 if(g[xx][yy]=='*') continue; 40 if(xx<0||x>=n||yy<0||yy>=m) continue; 41 if(k!=dir) dfs(xx,yy,k,turn+1); 42 else dfs(xx,yy,k,turn); 43 } 44 } 45 46 int main() 47 { 48 //freopen("D:\input.txt","r",stdin); 49 while(~scanf("%d%d",&n,&m)) 50 { 51 int ff=0; 52 for(int i=0;i<n;i++) 53 { 54 scanf("%s",g[i]); 55 if(!ff) 56 for(int j=0;j<m;j++) 57 if(g[i][j]=='S') {sx=i;sy=j;ff=1;} 58 } 59 flag=0; 60 memset(vis,inf,sizeof(vis)); 61 for(int k=0;k<4;k++) 62 { 63 int x=sx+dx[k]; 64 int y=sy+dy[k]; 65 if(x<0||x>=n||y<0||y>=m) continue; 66 if(g[x][y]!='*') dfs(x,y,k,0); 67 } 68 if(flag) puts("YES"); 69 else puts("NO"); 70 } 71 return 0; 72 }