您的位置:首页 > 其它

uva11624

2015-07-25 11:01 267 查看
题目名称: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;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: