HDU 1253

来源:互联网 发布:网络上赌博 编辑:程序博客网 时间:2024/06/08 07:31

2017.12.6对BFS的系列练习的第二题。
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1253
胜利大逃亡

Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 39809 Accepted Submission(s): 13957

Problem Description
Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.

魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.

这里写图片描述

Input
输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块……),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙.(如果对输入描述不清楚,可以参考Sample Input中的迷宫描述,它表示的就是上图中的迷宫)

特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.

Output
对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.

Sample Input
1
3 3 4 20
0 1 1 1
0 0 1 1
0 1 1 1
1 1 1 1
1 0 0 1
0 1 1 1
0 0 0 0
0 1 1 0
0 1 1 0

Sample Output
11

很轻松的三维BFS,注意一下x, y, z轴的方向。x轴是层数。
AC代码如下:

#include <cstdio>#include <cstring>#include <queue>using namespace std;const int maxn = 50;int a, b, c;int t;int ex, ey, ez;int ca[maxn][maxn][maxn];int vis[maxn][maxn][maxn];int dx[6] = {1, -1, 0, 0, 0, 0};int dy[6] = {0, 0, 1, -1, 0, 0};int dz[6] = {0, 0, 0, 0, 1, -1};struct Node{    int x, y, z;    int step;};int BFS(void){    memset(vis, 0, sizeof(vis));    queue<Node> I;    Node beg;    beg.x = beg.y = beg.z = beg.step = 0;    I.push(beg);    vis[beg.x][beg.y][beg.z] = 1;    while(!I.empty())    {        Node cur = I.front();        I.pop();        if(cur.step > t)    return -1;        if(cur.x == ex && cur.y == ey && cur.z == ez)    return cur.step;        for(int i = 0; i < 6; i++)        {            Node next;            next.x = cur.x + dx[i];            next.y = cur.y + dy[i];            next.z = cur.z + dz[i];            next.step = cur.step + 1;            if(next.x < 0 || next.x >= a || next.y < 0 || next.y >= b || next.z < 0 || next.z >= c)    continue;            if(vis[next.x][next.y][next.z] || ca[next.x][next.y][next.z])    continue;            if(next.step > t)    continue;            if(next.x == ex && next.y == ey && next.z == ez)    return next.step;            vis[next.x][next.y][next.z] = 1;            I.push(next);        }    }     return -1;}int main(){    int kase;    scanf("%d", &kase);    while(kase--)    {        scanf("%d %d %d %d", &a, &b, &c, &t);        for(int h = 0; h < a; h++)            for(int i = 0; i < b; i++)                for(int j = 0; j < c; j++)                    scanf("%d", &ca[h][i][j]);        ex = a - 1;        ey = b - 1;         ez = c - 1;        printf("%d\n", BFS());    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 下体长毛了很多肉芽很痒怎么办 对方拟把假离婚协议弄假成真怎么办 领主之塔改版后旧材料怎么办 汽车遥控钥匙打不开车门怎么办 苹果手机访问限制密码忘了怎么办 苹果的访问限制密码忘了怎么办 手机下雨天进水声音出了问题怎么办 胸太小了该怎么办经常揉胸会变大吗 鼻冲洗器冲鼻子耳朵进水怎么办 手表进水了然后里面有水珠怎么办 玩游戏后头晕恶心想吐怎么办 吃完美林3小时后又发烧怎么办 颜值和身材都是负分怎么办 妈妈离婚又有一个孩子我该怎么办 孩子妈妈天天给孩子吃药我该怎么办 被像蚂蚁有翅膀的虫子咬了怎么办 1周半宝宝扭脚丫肿了怎么办 离婚后前夫带孩子走了找不到怎么办 宜昌全视之眼逃出卢浮宫怎么办 qq号被盗了密保手机也被改怎么办 乐视盒子控播平台认证怎么办 购买冲气娃娃被发现了怎么办 买了充气娃娃太美舍不得扔怎么办 一品官老爷账号密码忘了怎么办 苹果手机加声音显示出耳机怎么办 被删除的照片恢复后效果变差怎么办 w10系统玩刺激战场声音小怎么办 宝宝不咳嗽但是喉咙有痰怎么办 深圳限行如果车堵在路上怎么办 奔跑吧qq中奖我填写资料怎么办 微信之前绑定的手机号丢了怎么办 龙之谷手游换装备洗炼材料怎么办 小学生在班上碰到流氓同学怎么办 问道手游仓库密码忘了怎么办 问道手游安全码忘了怎么办 问道手游账号密码忘了怎么办 坐一天一夜长途车腰疼怎么办 智联的简历一直说不完整怎么办 智联招聘简历投错了怎么办 投简历的公司写错面试时怎么办 从原单位辞职后档案一直没提怎么办