题目大意:给出一个三维迷宫的布局情况,输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块......),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙.
对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.
思路分析:还是一样,明显的bfs,刚开始学习,一开始用dfs实现了一下,明显超时,后用bfs实现了,在实现是要注意结接下来要走的问题是否越界的问题。
bfs实现代码:
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int map[55][55][55];
int d[6][3]={{1,0,0},{-1,0,0},{0,0,1},{0,0,-1},{0,1,0},{0,-1,0}};
int a,b,c,t;
struct Node{
int x,y,z;//点的位置坐标
int t;//走到这个点用的时间
Node(int a=0,int b=0,int c=0,int tt=0):x(a),y(b),z(c),t(tt){}
};
queue<Node>q;
int bfs(){
while(!q.empty())//清空队列
q.pop();
Node head(0,0,0,0);//起点位置
Node next;
if(head.x==a-1&&head.y==b-1&&head.z==c-1)//如果三维迷宫就这一个点,起点即终点的情况。
return 0;
map[head.x][head.y][head.z]=1;//迷宫中1代表是墙,即不能走,用此来代表这个点已被访问过,不能再走了
q.push(head);//将起始位置结点压入队列中
while(!q.empty()){
head=q.front();//获取队列中的头结点
q.pop();//头结点出队列
for(int i=0;i<6;i++){//确定接下来要走的路,即头结点的邻接点(对应树的下一层),把当前头结点的邻接点压入队列中
next.x=head.x+d[i][0];
next.y=head.y+d[i][1];
next.z=head.z+d[i][2];
if(next.x<0||next.x>=a||next.y<0||next.y>=b||next.z<0||next.z>=c||map[next.x][next.y][next.z]==1)//判断此时能走的点是否越界
continue;
if(!map[next.x][next.y][next.z]){//判断这个点是否被访问过
next.t=head.t+1;//走到这个点的时间是此时头结点的时间加1,就相当于树的深度加1.
map[next.x][next.y][next.z]=1;//当前的点设置为已访问过
q.push(next);//结点入队列
}
if(next.x==a-1&&next.y==b-1&&next.z==c-1) return next.t;//找到出口,返回走到这所用的时间
}
}
return -1;//没有找到
}
int main(){
int k;
while(~scanf("%d",&k)){
while(k--){
scanf("%d%d%d%d",&a,&b,&c,&t);
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
for(int k=0;k<c;k++)
scanf("%d",&map[i][j][k]);
}
}
int min_t=bfs();
if(min_t>t)
printf("-1\n");
else printf("%d\n",min_t);
}
}
}
dfs超时代码:
#include<stdio.h>
#include<string.h>
int r[55][55][55];
int visit[55][55][55];
int min_t;
int a,b,c,t;
void dfs(int x,int y,int z,int tt){
if(r[x][y][z]==1||visit[x][y][z]==1||x<0||x>=a||y<0||y>=b||z<0||z>=c||tt>min_t)
return;
if(x==a-1&&y==b-1&&z==c-1){
if(tt+1<min_t)
min_t=tt;
return;
}
//printf("*%d %d *%d %d %d\n",tt,min_t,x,y,z);
visit[x][y][z]=1;
dfs(x,y+1,z,tt+1);
dfs(x,y-1,z,tt+1);
dfs(x,y,z-1,tt+1);
dfs(x,y,z+1,tt+1);
dfs(x+1,y,z,tt+1);
dfs(x-1,y,z,tt+1);
visit[x][y][z]=0;
//printf("*%d %d *%d %d %d\n",tt,min_t,x,y,z);
}
int main(){
int k;
while(~scanf("%d",&k)){
while(k--){
min_t=1e9;
memset(visit,0,sizeof(visit));
scanf("%d%d%d%d",&a,&b,&c,&t);
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
for(int k=0;k<c;k++)
scanf("%d",&r[i][j][k]);
}
}
dfs(0,0,0,0);
if(min_t<=t)
printf("%d\n",min_t);
else printf("-1\n");
}
}
}