ZOJ 1671 Walking Ant

//又是一个BFS,不过这题很好玩,呵呵

一个容易出问题的地方是:蚂蚁有可能在两个加血点之间来回移动
所以,在到达一个FOOD点时,把它所有的HP状态都设为false即可

#include <iostream>
#include <queue>
using namespace std;
int HP;
bool ANTMAP[8][8][7];//是否走过(某一HP时)不用的话应该不行
int MAP[8][8];
struct ANTGO
{
 int x;
 int y;
 int HP;
 int step;
};
struct KEY
{
 int a;
 int b;
};
int main()
{
 KEY MYKEY[4];
 MYKEY[0].a = 1;
 MYKEY[0].b = 0;
 MYKEY[1].a = 0;
 MYKEY[1].b = 1;
 MYKEY[2].a = -1;
 MYKEY[2].b = 0;
 MYKEY[3].a = 0;
 MYKEY[3].b = -1;
 int m,n,i,j,k,x;
 queue<ANTGO> AntQueue;
 ANTGO Start,Temp,TT;
 while(cin >> m >> n)
 {
  if(m==0&&n==0)
   break;
  for(i=0;i<n;++i)
   for(j=0;j<m;++j)
    for(k=0;k<7;++k)
     ANTMAP[i][j][k] = false;
  for(i=0;i<n;++i)
   for(j=0;j<m;++j)
   {
    cin >> MAP[i][j];
    if(MAP[i][j]==2)
    {
     Start.x = i;
     Start.y = j;
     Start.HP = 6;
     Start.step = 0;
     ANTMAP[i][j][6] = false;
    }
   }
  AntQueue.push(Start);//顶入队列
  while(!AntQueue.empty())
  {
   Temp = AntQueue.front();
   AntQueue.pop();
   for(x=0;x<4;++x)
   {
    TT.y = Temp.y + MYKEY[x].a;
    TT.x = Temp.x + MYKEY[x].b;
    TT.HP = Temp.HP - 1;
    TT.step = Temp.step + 1;
    if(TT.x>=0&&TT.x<n&&TT.y>=0&&TT.y<m&&TT.HP>0)
    {
     if(ANTMAP[TT.x][TT.y][TT.HP]==false&&MAP[TT.x][TT.y]!=0)
     {
      if(MAP[TT.x][TT.y]==1||MAP[TT.x][TT.y]==2)
      {
       AntQueue.push(TT);
       ANTMAP[TT.x][TT.y][TT.HP] = true;
      }
      else if(MAP[TT.x][TT.y]==3)
       goto XXX;
      else
      {
       TT.HP = 6;
       AntQueue.push(TT);
       for(int r = 0;r < 7;++ r)
        ANTMAP[TT.x][TT.y][r] = true;
      }
     }
    }     
   }
  }
XXX:
  if(AntQueue.empty())
   cout << "-1" << endl;
  else
   cout << TT.step << endl;
  while(!AntQueue.empty())
   AntQueue.pop();
 }
 return 0;
}
posted on 2006-09-22 11:22  AnewR  阅读(276)  评论(0)    收藏  举报