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;
}
一个容易出问题的地方是:蚂蚁有可能在两个加血点之间来回移动
所以,在到达一个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;
}
浙公网安备 33010602011771号