标签:
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1129
题目分析:感觉题目说的不是多么的清晰,看了别人的分析觉得,也就是说在一个方向不能拐四次弯;大于四次就要return了;方向可以自己定义,方便使用就好
AC代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<queue> 4 #include<cstdio> 5 #include<cstring> 6 using namespace std; 7 int n , m; 8 char map[110][110]; 9 int ex,ey,sx,sy,flag ; 10 int dir[4][2] = {1,0,0,-1,-1,0,0,1}; 11 int vis[110][110]; 12 bool judge(int x,int y) 13 { 14 if(x<1 || x>n || y<1 || y>m || map[x][y] == ‘#‘) 15 return false; 16 return true; 17 } 18 void dfs(int D,int x,int y) 19 { 20 int xx,yy; 21 22 if(x == ex && y == ey) 23 { 24 flag =1; 25 return ; 26 } 27 int sd = D-1; 28 for(int i =0; i<4; i++) 29 { 30 D = (sd+i+8)%4; 31 xx = x + dir[D][0]; 32 yy = y + dir[D][1]; 33 //printf("dd: %d %d\n",xx,yy); 34 if(judge(xx,yy)) 35 { 36 if(vis[xx][yy] == 4) return ; 37 vis[xx][yy]++; 38 dfs(D,xx,yy); 39 return ;//这个可不能忘 40 } 41 } 42 return ; 43 } 44 int main() 45 { 46 char s; 47 while(scanf("%d %d",&n,&m)!=EOF) 48 { 49 memset(vis,0,sizeof(vis)); 50 for(int i = 1; i<=n; i++) 51 for(int j =1;j<=m; j++) 52 { 53 scanf(" %c",&map[i][j]); 54 if(map[i][j] == ‘T‘) sx =i,sy =j; 55 if(map[i][j] == ‘X‘) ex =i,ey =j; 56 } 57 scanf(" %c",&s); 58 vis[sx][sy] = 1; 59 int dr; 60 if(s == ‘S‘) dr = 0; 61 else if(s == ‘W‘) dr = 1; 62 else if(s == ‘N‘) dr = 2; 63 else dr = 3; 64 flag = 0; 65 dfs(dr,sx,sy); 66 if(flag) 67 printf("YES\n"); 68 else printf("NO\n"); 69 } 70 return 0; 71 }
标签:
原文地址:http://www.cnblogs.com/lovychen/p/4424557.html