HDU 1242 RESCUE(BFS)
BFS,注意把步数和时间区分对待
第一次写BFS代码微乱。
#include<stdio.h>
#define inf 100000000
char map[210][210];
int mintime[210][210];
int n,m,res;
char c;
int si,sj,ei,ej;
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
int ti,tj,tbu,ttime;
int queue[40010][4]; //0:i 1:j 2:bushu 3:time;
int inarea(int x,int y)
{
return x>=0 && y>=0 && x<n && y<m;
}
int bfs(int x,int y,int bu,int time)
{
int head=0,tail=0;
queue[tail][0]=x;
queue[tail][1]=y;
queue[tail][2]=bu;
queue[tail][3]=time;
tail++;
while(head<tail)
{
for(int i=0;i<4;i++)
{
ti=queue[head][0]+xx[i];
tj=queue[head][1]+yy[i];
if(inarea(ti,tj) && map[ti][tj]!='#')
{
tbu=queue[head][2]+1;
ttime=queue[head][3]+1;
if(map[ti][tj]=='x') ttime++;
if(ttime<mintime[ti][tj])
{
mintime[ti][tj]=ttime;
queue[tail][0]=ti;
queue[tail][1]=tj;
queue[tail][2]=tbu;
queue[tail][3]=ttime;
tail++;
}
}
}
head++;
}
return mintime[ei][ej];
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
getchar();
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
c=getchar();
mintime[i][j]=inf;
if(c=='r'){si=i; sj=j; map[i][j]='.';}
else if(c=='a'){ei=i; ej=j; map[i][j]='.';}
else map[i][j]=c;
}
getchar();
}
res=bfs(si,sj,0,0);
if(res==inf) printf("Poor ANGEL has to stay in the prison all his life.\n");
else printf("%d\n",res);
}
}

浙公网安备 33010602011771号