HDU 1253 胜利大逃亡
2016-07-28 19:48
555 查看
胜利大逃亡
[align=left]Problem Description[/align]Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.
魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.
超级经典的一道广搜求最短路的题,这时我刚刚开始学广搜,这个基本就是清晰的广搜走迷宫的模板。
#include<stdio.h> #include<string.h> typedef struct node { short x, y, z; int t; } Q; Q q[250002] ;//队列 bool m[51][51][51] ;//迷宫,因为只有0,1状态,所以用bool节省内存 int d[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}} ;//六个方向六种走法, int A,B,C,T ; int ok(int x ,int y ,int z)//判断该点是否出边界 { if(x>=0 && x < A && y >=0 && y < B && z >=0 && z< C) return 1 ; return 0 ; } void inq(int x ,int y ,int z ,int t,int &tail) //入队,把x,y,z,t放入队中 { q[tail].x = x ; q[tail].y = y ; q[tail].z = z ; q[tail++].t = t ; } int bfs()//广搜函数 { int head=0 ,tail=1 ,x, y, z,t; m[0][0][0] = 1; while(head < tail)//从头开始找路径,头在推后,这样找的全面,找分支,当head=tail时所有找完该结束了 { x = q[head].x ; y = q[head].y ; z = q[head].z ; t = q[head].t ;//给四个元素赋值 for(int i=0 ; i<6 ; i++)//按顺序进队,分别向六个方向走 { int x1=x+d[i][0], y1=y+d[i][1], z1=z+d[i][2] ;//x1,y1,z1为移动后的位置 if(ok(x1,y1,z1) && !m[x1][y1][z1])//判断移动后点没有出界且是空点 { inq(x1,y1,z1,t+1,tail) ;//入队,把x,y,z,t放入队中 m[x1][y1][z1]= 1;//标记为已经访问 } if(q[tail-1].x == A-1 && q[tail-1].y == B-1 && q[tail-1].z == C-1 && q[tail-1].t <= T)//判断刚刚入队的元素是否为终点,如果是的话返回其用时 return q[tail-1].t; } head++; } return -1 ;//如果不存在可行解,按规定返回-1 } int main() { int c ; scanf("%d",&c) ; while(c--) { scanf("%d %d %d %d",&A,&B,&C,&T); for(int k=0; k<A; k++) for(int i=0; i<B; i++) for(int j=0; j<C; j++) scanf("%d", &m[k][i][j]) ;//初始化数据 printf("%d\n",bfs()) ;//打印用时 } return 0 ; }
相关文章推荐
- IOS获取系统通讯录联系人信息
- 对h5 css3的更多新的认识
- Mac显示隐藏文件的方法
- unix环境高级编程-进程环境
- 版本更新工具类
- 通过gdb来查看当前sshd的配置
- 关于数组首元素地址与数组首地址的区分
- 正则表达式小例
- 无法导出p12证书的问题解决办法
- 友盟获取QQ头像和昵称
- linphone-PresenceActivity.java文件分析
- [刷题]算法竞赛入门经典(第2版) 4-2/UVa201 - Squares
- 理解v4包下ViewPager类的用法
- Effective C++_Item3笔记
- HDU 5764 After a Sleepless Night
- Linux常用命令
- pyqt5猜数游戏
- 任意文件下载
- Unix网络编程之socket编程(一)--socket入门简单程序
- html Frame、Iframe、Frameset 的区别