4129:变换的迷宫(bfs)

Posted aiqinger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4129:变换的迷宫(bfs)相关的知识,希望对你有一定的参考价值。

总时间限制: 

1000ms
 
内存限制: 
65536kB
描述

你现在身处一个R*C 的迷宫中,你的位置用"S" 表示,迷宫的出口用"E" 表示。

迷宫中有一些石头,用"#" 表示,还有一些可以随意走动的区域,用"." 表示。

初始时间为0 时,你站在地图中标记为"S" 的位置上。你每移动一步(向上下左右方向移动)会花费一个单位时间。你必须一直保持移动,不能停留在原地不走。

当前时间是K 的倍数时,迷宫中的石头就会消失,此时你可以走到这些位置上。在其余的时间里,你不能走到石头所在的位置。

求你从初始位置走到迷宫出口最少需要花费多少个单位时间。

如果无法走到出口,则输出"Oop!"。

输入
第一行是一个正整数 T,表示有 T 组数据。
每组数据的第一行包含三个用空格分开的正整数,分别为 R、C、K。
接下来的 R 行中,每行包含了 C 个字符,分别可能是 "S"、"E"、"#" 或 "."。
其中,0 < T <= 20,0 < R, C <= 100,2 <= K <= 10。
输出
对于每组数据,如果能够走到迷宫的出口,则输出一个正整数,表示最少需要花费的单位时间,否则输出 "Oop!"。
样例输入
1
6 6 2
...S..
...#..
.#....
...#..
...#..
..#E#.
样例输出
7
先贴个我的代码,wrong了N次就是AC不了,崩溃了,大佬帮忙看看哪里的问题?
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct Node {
 5     int r,c,step;
 6     Node(int rr,int cc,int ss):r(rr),c(cc),step(ss) {}
 7     Node() {}
 8 };
 9 char a[105][105];
10 int T,R,C,K;
11 int visit[105][105][15];
12 int dr[4]={1,-1,0,0};
13 int dc[4]={0,0,1,-1};
14 Node start,goal;
15 queue <Node> q;
16 
17 int main() {
18     cin>>T;
19     while(T--) {
20         cin>>R>>C>>K;
21         memset(visit,1,sizeof(visit));
22         for(int i=1; i<=R; i++) {
23             for(int j=1; j<=C; j++) {
24                 cin>>a[i][j];
25                 if(a[i][j]==S) {
26                     a[i][j]==.;
27                     start=Node(i,j,0);
28                 }
29                 if(a[i][j]==E) {
30                     goal=Node(i,j,-1);
31                     a[i][j]=.;
32                 }
33                 for(int k=0; k<K; k++) {
34                     visit[i][j][k]=0;
35                 }
36             }
37         }
38         while(!q.empty())q.pop();
39         visit[start.r][start.c][0]=1;
40         q.push(start);
41         while(!q.empty()) {
42             Node p=q.front();
43             q.pop();
44             if(p.r==goal.r&&p.c==goal.c) {
45                 cout<<p.step<<endl;
46                 goto hhh; 
47             } else {
48                 for(int i=0; i<4; i++) {
49                     int rr=p.r+dr[i];
50                     int cc=p.c+dc[i];
51                     int ss=(p.step+1)%K;
52                     if(rr==goal.r&&cc==goal.c){
53                         cout<<p.step+1<<endl;
54                         goto hhh;
55                     } 
56                     if(!visit[rr][cc][ss]&&ss==0) {
57                         visit[rr][cc][ss]=1;
58                         q.push(Node(rr,cc,p.step+1));
59                     }
60                     if(!visit[rr][cc][ss]&&ss!=0&&a[rr][cc]==.) {
61                         visit[rr][cc][ss]=1;
62                         q.push(Node(rr,cc,p.step+1));
63                     }
64                 }
65             }        
66         }
67         if(q.empty())cout<<"Oop!"<<endl;
68         hhh:;
69     }
70 
71     return 0;
72 }

下面的代码为什么就可以通过呢?

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int r, c, k;
 6 int visited[105][105][15];
 7 int mmap[105][105];
 8 int sx, sy, ex, ey;
 9 int dir1[4] = { 0,0,1,-1 }, dir2[4] = { 1,-1,0,0 };
10 int flag = 0;
11 
12 struct node{
13     int time;
14     int x, y;
15     node(int _x, int _y) :x(_x), y(_y) { time = 0; }
16 };
17 queue<node> all;
18 
19 void bfs() {
20     while (!all.empty()) {
21         node now = all.front();
22         all.pop();
23         for (int i = 0; i < 4; i++) {
24             int xx = now.x + dir1[i], yy = now.y + dir2[i];
25             node newone(now);
26             newone.x = xx, newone.y = yy;
27             newone.time = now.time + 1;
28             int tmptime = newone.time%k;
29             if (xx == ex && yy == ey) {
30                 printf("%d
", newone.time);
31                 flag = 1;
32                 return;
33             }
34             if (mmap[xx][yy]==1&&visited[xx][yy][tmptime] == 0||mmap[xx][yy]==2&&
35              visited[xx][yy][tmptime] == 0&&tmptime==0)
36             {
37                 all.push(newone);
38                 visited[xx][yy][tmptime] = 1;
39             }
40         }
41     }
42 }
43 
44 int main()
45 {
46     int t;
47     scanf("%d", &t);
48     while (t--) {
49         all = queue<node>();
50         memset(visited, 0, sizeof(int) * 105 * 105 * 15);
51         memset(mmap, 0, sizeof(int) * 105 * 105 );
52         flag = 0;
53         scanf("%d%d%d", &r, &c, &k);
54         for(int i=1;i<=r;i++)
55             for (int j = 1; j <= c; j++) {
56                 char ch;
57                 cin >> ch;
58                 if (ch == .)
59                     mmap[i][j] = 1;
60                 else if (ch == S)
61                 {
62                     mmap[i][j] = 1;
63                     sx = i, sy = j;
64                 }
65                 else if (ch == E) {
66                     mmap[i][j] = 1;
67                     ex = i, ey = j;
68                 }
69                 else
70                     mmap[i][j] = 2;
71             }
72         node origin(sx,sy);
73         all.push(origin);
74         visited[sx][sy][0] = 1;
75         bfs();
76         if (!flag)
77             printf("Oop!
");
78     }
79     return 0;
80 }

 

以上是关于4129:变换的迷宫(bfs)的主要内容,如果未能解决你的问题,请参考以下文章

通过迷宫问题简单学习DFS和BFS算法

通过迷宫问题简单学习DFS和BFS算法

通过迷宫问题简单学习DFS和BFS算法

BFS-迷宫最短路径问题

使用BFS(广度优先搜索)解迷宫类问题

迷宫bfs+路径记录