zoj 1671 Walking Ant (BFS)

16 篇文章 0 订阅

昨天写了一晚上,以为还是一般的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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值