昨天写了一晚上,以为还是一般的BFS,可是一直到睡觉时,样例还没过去。。。。当时就想删了重写,冲动是魔鬼啊!幸好没冲动,留下来了,现在又看,恩,只是多加了一个判断,昨天的功夫没白费。。
说下昨天没考虑到的情况:
我原是用HP[8][8]数组来代表蚂蚁走到每个格子时候的HP值,但是疏忽了一点:由于格子可以重复走,所以当BFS搜索散开时,可能会出现交叉,这样用HP[i][j]=HP[p1][p2]-1来计算时,就会出现混乱。。。。
所以做了一些改动:在下一步前,先比较(HP[p1][p2]-1)和当前HP[i][j]的大小,如果比当前大,就接着执行,否则直接跳过。。。
恩,就是这样了
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define STOP system("pause")
int head,rear,s1[1000],s2[1000];
void In(int i,int j)
{
s1[rear]=i;
s2[rear]=j;
rear++;
}
void Out(int *x,int *y)
{
*x=s1[head];
*y=s2[head];
head++;
}
int isEmpty()
{
if(head==rear)
return 1;
else
return 0;
}
int main()
{
int w,h,m,HP[8][8],i,j,x1,y1,p1,p2,temp,a[8][8],count[8][8],hp;
int t1[4]={0,0,-1,1};
int t2[4]={1,-1,0,0};
while(scanf("%d%d",&w,&h)&&!(w==0&&h==0))
{
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
scanf("%d",&a[i][j]);
count[i][j]=0;
if(a[i][j]==2)
{
x1=i;
y1=j;
}
}
memset(HP,0,sizeof(HP));
temp=1;
HP[x1][y1]=6;
head=rear=count[x1][y1]=0;
In(x1,y1);
while(!isEmpty()&&temp)
{
Out(&p1,&p2);
for(m=0;m<4;m++)
{
i=p1+t1[m],j=p2+t2[m];
if(i>=0&&i<h&&j>=0&&j<w)
{
hp=HP[p1][p2]-1;
if(hp>HP[i][j])//这个if语句昨天没想到,导致昨天一晚上也没A出来
{
HP[i][j]=hp;
if(a[i][j]==3&&HP[i][j]>=1)
{
count[i][j]=count[p1][p2]+1;
temp=0;
printf("%d\n",count[i][j]);
break;
}
if(a[i][j]==4&&HP[i][j]>=1)
{
count[i][j]=count[p1][p2]+1;
HP[i][j]=6;
In(i,j);
}
if(a[i][j]==1&&HP[i][j]>=1)
{
count[i][j]=count[p1][p2]+1;
In(i,j);
}
}
}
}
}
if(temp)
printf("-1\n");
}
return 0;
}