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\n", 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!\n"); 78 } 79 return 0; 80 }
越努力越幸运