hdoj 1253 三维bfs()

来源:互联网 发布:淘宝众筹市场管理规范 编辑:程序博客网 时间:2024/06/09 15:12
#include<iostream>#include<stdio.h>#include<string>#include<queue>using namespace std;#define MAX 52int casen;int map[MAX][MAX][MAX];int dist[MAX][MAX][MAX];int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};int T;int X,Y,Z;class Point{public :    int x;    int y;    int z;};void input(){int i,j,k;for(i=0;i<Z;i++){for(j=0;j<Y;j++){for(k=0;k<X;k++){scanf("%d",&map[k][j][i]);}//getchar();}}}int over(Point p){if(p.x<0||p.y<0||p.z<0)return 1;if(p.x>=X||p.y>=Y||p.z>=Z)return 1;return 0;}void bfs(){queue<Point>q;int i;Point start,p,cs;start.x=0;start.y=0;start.z=0;q.push(start);dist[start.x][start.y][start.z]=0;while(!q.empty()){p=q.front();q.pop();for(i=0;i<6;i++){cs.x=p.x+dir[i][0];cs.y=p.y+dir[i][1];cs.z=p.z+dir[i][2];if(over(cs))//越界continue;if(map[cs.x][cs.y][cs.z]==1)//墙continue;if(dist[cs.x][cs.y][cs.z]!=-1)//访问过continue; dist[cs.x][cs.y][cs.z]=dist[p.x][p.y][p.z]+1; q.push(cs);}}}void init(){int i,j,k;for(i=0;i<MAX;i++){for(j=0;j<MAX;j++){for(k=0;k<MAX;k++){map[i][j][k]=0;dist[i][j][k]=-1;}}}}int main(){//freopen("input.txt","r",stdin);scanf("%d",&casen);getchar();while(casen--){scanf("%d %d %d %d",&Z,&Y,&X,&T);//getchar();init();input();bfs();if(dist[X-1][Y-1][Z-1]==-1||dist[X-1][Y-1][Z-1]>T){cout<<-1<<endl;}else{cout<<dist[X-1][Y-1][Z-1]<<endl;}}return 0;}/*1 scanf中间可以换行或者其他都没有关系。2 c++比g++快一点,所以如果超时的话,就用c++试一下。*/