uva11624
题目名称:Fire!
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671
题意:joe在一个迷宫里,有地方着火,火的蔓延方向是上下左右,每次一格,joe可以走的方向也是上下左右,每次一格,问joe能否走出这个迷宫,可以输出最短的走出时间,‘ # ‘ 表示墙,’ F ‘ 表示火,’ . ' 表示可走
思路:bfs,不过有点麻烦,,然后还有点坑,也许是他的内部输入数据有些后面多了个空格什么的,,用getchar(),一直wa,调试了一天,以为是主程序哪里错了==,,,还要注意得先把火扔进队列
代码如下:
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<queue> using namespace std; char a[1005][1005]; int Jx,Jy; bool vis[1005][1005]; //记录是否走过 int dir[4][2]={1,0,-1,0,0,1,0,-1}; int ok; //记录最短步数 int R,C; struct Node { int x,y; int sum; bool fire; //判断是否为火 }que[1001*1001]; int bfs() { int frot=0,rear=0; memset(vis,false,sizeof(vis)); for(int i=0;i<R;i++) for(int j=0;j<C;j++) if(a[i][j]=='F') //火的数目可能有多个 { que[rear].x=i; que[rear].y=j; que[rear].sum=0; que[rear].fire=true; rear++; } que[rear].x=Jx; que[rear].y=Jy; que[rear].sum=0; que[rear].fire=false; rear++; while(frot<rear) { int xx=que[frot].x; int yy=que[frot].y; for(int i=0;i<4;i++) { int xx=que[frot].x+dir[i][0]; int yy=que[frot].y+dir[i][1]; if(que[frot].fire) //火 { if(xx<0||yy>=C||yy<0||xx>=R||a[xx][yy]=='#'||a[xx][yy]=='F') continue; a[xx][yy]='F'; que[rear].x=xx; que[rear].y=yy; que[rear].sum=que[frot].sum+1; que[rear].fire=true; rear++; } else //人 { if(vis[xx][yy]||a[xx][yy]=='#'||a[xx][yy]=='F') continue; if(xx<0||yy<0||xx>=R||yy>=C) return que[frot].sum+1; vis[xx][yy]=true; que[rear].x=xx; que[rear].y=yy; que[rear].sum=que[frot].sum+1; que[rear].fire=false; rear++; } } frot++; } return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&R,&C); memset(vis,0,sizeof(vis)); Jx=Jy=-1; for(int i=0; i<R; i++) { scanf("%s", a[i]); if(Jx == -1) for(int j=0; j<C; j++) if(a[i][j] == 'J') { Jx = i; Jy = j; break; } } /* getchar(); //就是这样写,,一直wa for(int i=0; i<R; i++) { for(int j=0; j<C; j++) { scanf("%c", &a[i][j]); if(a[i][j] == 'J') { Jx = i; Jy = j; } } getchar(); } */ ok=bfs(); if(ok) printf("%d\n",ok); else printf("IMPOSSIBLE\n"); } return 0; }
本文版权归作者本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.