【题意】:一个迷宫,有一个入口和出口。一个人想从入口进来,然后到达出口,又从出口进来,回到入口。但是他害怕走不出迷宫,于是他想到了一种走的方法:1.优先靠右边走,能向右转的都向右转 2.不能靠右走的话就选择直走 3.右走和直走都不能走的话选择向左走 4.前面三种都不能走的话向后走。题目保证肯定存在一条从入口到出口的路,然后人必须按照上述的方法走迷宫。问最后,人能否把迷宫每个格子都走一遍?

【题解】:题目明显就是让你搜索的,对于每个格子i,j加多一维记录方向就好了。由于数据最大是500*500,所以用系统栈会爆掉,改成非递归即可。如果你深一层理解题目的话,会发现是不需要用栈的,只需要一个循环就可以了,直接上代码了,大家不懂再问吧。

【代码】:
 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 #define MAX 505
 5 
 6 struct node {
 7     int x, y, dir;
 8     void init(int a, int b, int c) {
 9         x = a, y = b, dir = c;
10     }
11 } s, t, goal;
12 int r, c, n, m;
13 int maz[MAX][MAX][4];
14 bool visit[MAX][MAX];
15 const int dx[] = {010-1};
16 const int dy[] = {10-10};
17 
18 void dfs(node now, node goal) {
19     node next;
20     while (1) {
21         visit[now.x][now.y] = true;
22         if (now.x == goal.x && now.y == goal.y && now.dir == goal.dir) break;
23         for (int i = now.dir; i < 4 + now.dir; i++) {
24             int index = (now.dir - (i - now.dir) + 4% 4;
25             if (maz[now.x][now.y][(now.dir - (i - now.dir) + 5% 4== 0) {
26                 next.init(now.x + dx[index], now.y + dy[index], (now.dir - (i - now.dir) + 5% 4);
27                 now = next;
28                 break;
29             }
30         }
31     }
32 }
33 
34 void init() {
35     for (int i = 1; i <= r; i++)
36         for (int j = 1; j <= c; j++) {
37             visit[i][j] = false;
38             for (int k = 0; k < 4; k++)
39                 maz[i][j][k] = 1;
40         }
41         maz[t.x][t.y][s.dir] = maz[s.x][s.y][t.dir] = 0;
42 }
43 
44 int main() {
45     int T;
46     scanf("%d"&T);
47     while (T--) {
48         scanf("%d%d"&r, &c);
49         scanf("%d%d"&s.y, &t.y);
50         s.init(1, s.y + 12), t.init(r, t.y + 10);
51         init();
52         for (int i = 1; i < 2 * r; i++) {
53             if (i % 2 != 0) {
54                 for (int j = 1; j < c; j++) {
55                     scanf("%d"&maz[(i + 1/ 2][j][1]);
56                     maz[(i + 1/ 2][j + 1][3= maz[(i + 1/ 2][j][1];
57                 }
58             } else {
59                 for (int j = 1; j <= c; j++) {
60                     scanf("%d"&maz[i / 2][j][2]);
61                     maz[i / 2 + 1][j][0= maz[i / 2][j][2];
62                 }
63             }
64         }
65         goal.init(t.x + 1, t.y, s.dir);
66         dfs(s, goal);
67         goal.init(s.x - 1, s.y, t.dir);
68         dfs(t, goal);
69         bool flag = false;
70         for (int i = 1; i <= r; i++)
71             for (int j = 1; j <= c; j++)
72                 if (!visit[i][j])
73                     flag = true;
74         if (!flag) printf("YES\n");
75         else printf("NO\n");
76     }
77     return 0;
78 }