UVa (BFS) The Monocycle

题目不光要求要到达终点而且要求所走的步数为5的倍数,每个时刻有三个选择,前进,左转弯,右转弯。

所以在vis数组中新增加两个维度即可,vis[x][y][dir][color]表示在(x, y)格子方向朝dir与地面接触的扇形的颜色为color,这个状态是否到达过。

 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int maxn = 30;
 7 char maze[maxn][maxn];
 8 bool vis[maxn][maxn][4][5];
 9 
10 struct Node
11 {
12     int x, y, d, t, step;
13     Node(int x=0, int y=0, int d=0, int t=0, int step=0):x(x), y(y), d(d), t(t), step(step) {}
14 }st, ed;
15 
16 int dx[] = { -1, 0, 1, 0 };
17 int dy[] = { 0, 1, 0, -1 };
18 
19 int row, col;
20 
21 inline bool in(int x, int y)
22 { return x >= 0 && x < row && y >= 0 && y < col; }
23 
24 int BFS()
25 {
26     memset(vis, false, sizeof(vis));
27     queue<Node> Q;
28     Q.push(st);
29     vis[st.x][st.y][0][0] = true;
30     while(!Q.empty())
31     {
32         Node now = Q.front(); Q.pop();
33         if(now.x == ed.x && now.y == ed.y && now.step % 5 == 0)
34             return now.t;
35 
36         int d = now.d;
37         int x = now.x + dx[d];
38         int y = now.y + dy[d];
39         int t = now.t + 1;
40         int step = now.step + 1;
41         if(in(x, y) && maze[x][y] != '#' && !vis[x][y][d][step%5])
42         {
43             Q.push(Node(x, y, d, t, step));
44             vis[x][y][d][step%5] = true;
45         }
46 
47         for(int i = 1; i <= 3; i += 2)
48         {
49             x = now.x; y = now.y;
50             d = (now.d + i) % 4;
51             t = now.t + 1;
52             step = now.step;
53             if(!vis[x][y][d][step%5])
54             {
55                 Q.push(Node(x, y, d, t, step));
56                 vis[x][y][d][step%5] = true;
57             }
58         }
59     }
60     return -1;
61 }
62 
63 int main()
64 {
65     //freopen("in.txt", "r", stdin);
66 
67     int kase = 0;
68     while(scanf("%d%d", &row, &col) == 2)
69     {
70         if(row == 0 && col == 0) break;
71 
72         if(kase++ > 0) puts("");
73         printf("Case #%d\n", kase);
74 
75         if(row == 0 && col == 0) break;
76         for(int i = 0; i < row; i++) scanf("%s", maze[i]);
77         for(int i = 0; i < row; i++)
78             for(int j = 0; j < col; j++)
79             {
80                 if(maze[i][j] == 'S') st = Node(i, j, 0, 0, 0);
81                 if(maze[i][j] == 'T') ed = Node(i, j);
82             }
83 
84         int ans = BFS();
85         if(ans >= 0) printf("minimum time = %d sec\n", ans);
86         else puts("destination not reachable");
87     }
88 
89     return 0;
90 }
代码君

 

posted @ 2015-04-21 19:24  AOQNRMGYXLMV  阅读(145)  评论(0编辑  收藏  举报