nyoj 1129 Salvation

题目链接: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
",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
");
68              else printf("NO
");
69     }
70     return 0;
71 }
原文地址:https://www.cnblogs.com/lovychen/p/4424557.html