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)。对于符合条件的元素,将其加入队列中,在以后的循环中进行检测。
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; }
相关文章推荐
- HDU 1253 - 胜利大逃亡(三维搜索)
- 搜索专题(BFS)HDU 1253-胜利大逃亡
- hdu(1253)胜利大逃亡(队列+搜索)
- hdu 1253 胜利大逃亡 (三维简单bfs+剪枝)
- hdu 1253 胜利大逃亡(bfs)
- HDU 1253:胜利大逃亡(简单三维BFS)
- HDU 1253 胜利大逃亡(BFS)
- hdu 1253 胜利大逃亡
- hdu 1253 胜利大逃亡(三维bfs+剪枝)
- HDU 1253 胜利大逃亡(空间BFS)
- hdu-1253 胜利大逃亡(BFS)
- HDU-1253-胜利大逃亡
- HDU 1253 胜利大逃亡
- hdu 1253 胜利大逃亡 (三维简单bfs+剪枝)
- hdu 1253 胜利大逃亡 (深搜)
- HDU-1253-胜利大逃亡
- hdu 1253 胜利大逃亡(广搜,队列,三维,简单)
- hdu - 1240 Nightmare && hdu - 1253 胜利大逃亡(bfs)
- bfs广搜 胜利大逃亡 HDU - 1253
- HDU 1253 胜利大逃亡( BFS )