您的位置:首页 > 其它

hdu 1253 胜利大逃亡 (BFS)

2016-03-20 21:29 411 查看
解题思路:本题主要通过bfs搜索的方式寻找最短路,采用一个记录时间的二维数组,将为搜索过的位置所需时间设置为无穷大,避免重复访问。
#include <iostream>#include <cstdio>#include <queue>#include <cstring>using namespace std;#define inf 0x3f3f3f3f //设置一个较大的整数int k,a,b,c,t;int map[60][60][60];    //存储迷宫int time[60][60][60];	//记录时间struct point{int x,y,z;};queue<point>P;int dx[6] = {0,0,0,0,1,-1};	//标志六个方位int dy[6] = {0,0,1,-1,0,0};int dz[6] = {1,-1,0,0,0,0};int bfs( point s ){memset(time,0x3f,sizeof(time));  //将时间初始化为这个较大的整数time[0][0][0] = 0;int i;P.push( s );point hd;//保存队列头while( !P.empty()){hd = P.front();		//取出队列头P.pop();		//清除当前队列头if(hd.x==a-1 && hd.y==b-1 && hd.z == c-1) break;for(i=0;i<6;i++){int x = hd.x + dx[i];int y = hd.y + dy[i];int z = hd.z + dz[i];if(x>=0 && x<=a-1 && y>=0 && y<=b-1 && z>=0 && z<=c-1 && map[x][y][z]==0 && time[x][y][z]==inf)  //判断当前位置是否可以行走{point t;t.x = x; t.y=y; t.z=z;	//记录当前位置,下一行将它加入队列P.push(t);time[x][y][z] = time[hd.x][hd.y][hd.z] +1;}}}return time[a-1][b-1][c-1];}int main(){//freopen("test.txt","r",stdin);int i,j,r;int min;point start;start.x = 0; start.y = 0; start.z = 0;//起点位置scanf("%d",&k);while(k--){scanf("%d%d%d%d",&a,&b,&c,&t);for(i=0;i<a;i++){for(j=0;j<b;j++){for(r=0;r<c;r++){scanf("%d",&map[i][j][r]);}}}/*for(i=0;i<a;i++){for(j=0;j<b;j++){for(r=0;r<c;r++){printf("%d",map[i][j][r]);}printf("\n");}}*///printf("%d %d %d %d",a,b,c,t);if(map[a-1][b-1][c-1]==1) {printf("-1\n");continue;}if(a+b+c-3>t) {printf("-1\n");continue;}min = bfs(start);if(min<=t)printf("%d\n",min);elseprintf("-1\n");}//cout << "Hello world!" << endl;return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: