HDU 1253 -- 胜利大逃亡 bfs

题目大意:给出一个三维迷宫的布局情况,输入数据的第一行是一个正整数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");
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值