您的位置:首页 > 其它

hdu 1253 胜利大逃亡(搜索)

2013-03-17 17:20 330 查看
因为学广搜那几天状态非常不好,所以之前对搜索几乎完全不会。现在要重新学搜索。

1、代码中声明一个队列的时候是q<node>q,开始的时候一直写成q(node)q。

2、q.push(cur)是为了给队列一个最早的元素,使q.empty()判定不为空。

3、q.pop()是删除队列中已经检测过的元素。

4、map[x][y][z]=1。对于已经走过的格子,将其值用1标记。

5、q.push(next)。对于符合条件的元素,将其加入队列中,在以后的循环中进行检测。

#include<stdio.h>
#include<queue>
using namespace std;
struct node
{
int x,y,z,step;
};
int map[55][55][55],a,b,c,t;
int dir[6][3]={0,0,-1, 0,0,1, 0,1,0, 0,-1,0, 1,0,0, -1,0,0};

int judge(int x,int y,int z)
{
if(x<a&&y<b&&z<c&&x>=0&&y>=0&&z>=0&&map[x][y][z]==0)
return 1;
return 0;
}

int bfs()
{
node cur,next;
queue<node>q;
int i,x,y,z;
cur.x=cur.y=cur.z=cur.step=0;
q.push(cur);
map[0][0][0]=1;
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur.step>=t)
return -1;
next.step=cur.step+1;
for(i=0;i<6;i++)
{
next.x=x=cur.x+dir[i][0];
next.y=y=cur.y+dir[i][1];
next.z=z=cur.z+dir[i][2];
if(judge(x,y,z))
{
if(x==a-1&&y==b-1&&z==c-1)
return next.step;
map[x][y][z]=1;
q.push(next);
}
}
}
return -1;
}
int main()
{
int i,j,k,T;
int ans;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&a,&b,&c,&t);
for(i=0;i<a;i++)
for(j=0;j<b;j++)
for(k=0;k<c;k++)
scanf("%d",&map[i][j][k]);
if(map[a-1][b-1][c-1])
ans=-1;
else
ans=bfs();
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: