UVA---11624--截屏--
思路:每步先让火走--然后人走其他的路--就可以保证人不会被火烧了--
超时原因:在分为两个队列时--有一个走过的路忘覆盖了-----要细心呀--0.0---
两队列如下代码:
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
char ma[1010][1010];
int n,m,rx,ry,fx,fy;
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
struct node{
int x,y,step;
}now,qian,ff;
void bfs()
{
/*4 4
####
#JF#
#..#
#..#*/
queue <node> R;
queue <node> F;
now.x=rx;now.y=ry;now.step=0;
R.push(now);int lu=0;
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
{
if (ma[i][j]=='F')
{
ma[i][j]='#';
now.x=i;now.y=j;now.step=0;
F.push(now);
}
}
while (!R.empty())
{
now=R.front();
if (now.step>lu)
lu++;
if (now.step==lu)
{
while (!F.empty())
{
ff=F.front();
if (ff.step>lu)
break;
F.pop();
for (int i=0;i<4;i++)
{
int kx=ff.x+xx[i];
int ky=ff.y+yy[i];
if (kx>=0&&kx<n&&ky>=0&&ky<m&&ma[kx][ky]!='#')
{
ma[kx][ky]='#';
qian.x=kx;qian.y=ky;qian.step=ff.step+1;
F.push(qian);
}
}
}
}
R.pop();
for (int i=0;i<4;i++)
{
int kx=now.x+xx[i];
int ky=now.y+yy[i];
if (kx<0||ky<0||kx==n||ky==m)
{
printf("%d\n",now.step+1);
return ;
}
else if (ma[kx][ky]!='#')
{
ma[kx][ky]='#';
qian.x=kx;qian.y=ky;
qian.step=now.step+1;
R.push(qian);
}
}
}
printf("IMPOSSIBLE\n");
}
int main()
{
int t;scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
{
scanf("%s",ma[i]);
for (int j=0;j<m;j++)
{
if (ma[i][j]=='J')
{
rx=i;ry=j;
ma[i][j]='#';
}
}
}
bfs();
}
return 0;
}
一队列代码:
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
char ma[1010][1010];
int n,m,rx,ry,fx,fy;
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
struct node{
int x,y,step;
bool fafe;
}now,qian,ff;
int bfs()
{
queue <node> que;
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
{
if (ma[i][j]=='F')
{
now.x=i;now.y=j;now.step=0;
now.fafe=true;
que.push(now);
ma[i][j]='#';
}
}
now.x=rx;now.y=ry;now.step=0;now.fafe=false;
que.push(now);
while (!que.empty())
{
now=que.front();
que.pop();
if (now.fafe)
{
for (int i=0;i<4;i++)
{
int kx=now.x+xx[i];
int ky=now.y+yy[i];
if (kx<0||ky<0||kx==n||ky==m||ma[kx][ky]=='#') continue;
{
ma[kx][ky]='#';
qian.x=kx;qian.y=ky;
qian.step=now.step+1;
qian.fafe=true;
que.push(qian);
}
}
}
else
{
for (int i=0;i<4;i++)
{
int kx=now.x+xx[i];
int ky=now.y+yy[i];
if (kx<0||ky<0||kx==n||ky==m)
{
return now.step+1;
}
if (ma[kx][ky]!='#')
{
ma[kx][ky]='#';
qian.x=kx;qian.y=ky;
qian.step=now.step+1;
qian.fafe=false;
que.push(qian);
}
}
}
}
return 0;
}
int main()
{
int t;scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
{
scanf("%s",ma[i]);
for (int j=0;j<m;j++)
{
if (ma[i][j]=='J')
{
rx=i;ry=j;
ma[i][j]='#';
}
}
}
int ans=bfs();
if (ans)
printf("%d\n",ans);
else
printf("IMPOSSIBLE\n");
}
return 0;
}