HDU 1253 胜利大逃亡
2016-07-15 23:35
375 查看
题目大意:简单来说就是问你在指定时间内从(0,0,0)能否到达(a-1,b-1,c-1)
解题思路:由于这道题的范围是不少于1000组测试数据 再加上不低于50*50*50 的三维 所以这道题只能采用bfs来做 依次搜索它的六个方向 入队 出队 1为墙 0为路 就是一典型的bfs模板的题 把二维变成了三维 仅此而已
下面我就直接上代码了。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <map> #include <cmath> #include <queue> using namespace std; int a,b,c,T; int xi[7]={1,-1,0,0,0,0}; int yi[7]={0,0,1,-1,0,0}; int zi[7]={0,0,0,0,1,-1}; struct node { int x; int y; int z; }q[505000],d,v,s; int num[51][51][51]; int vis[51][51][51]; int maps[51][51][51]; int bfs() { int l=0,r=0; s.x=0,s.y=0,s.z=0; q[r++]=s; num[0][0][0]=0; while(l<r) { d=q[l++]; if(num[d.x][d.y][d.z]>T)//当前步数大于T return -1; if(d.x==a-1&&d.y==b-1&&d.z==c-1&&num[d.x][d.y][d.z]<=T)//符合条件 return num[d.x][d.y][d.z]; else { for(int i=0;i<6;i++)//搜一个点的六个方向 { v.x=d.x+xi[i]; v.y=d.y+yi[i]; v.z=d.z+zi[i]; if(v.x<0||v.y<0||v.z<0||v.x>=a||v.y>=b||v.z>=c||maps[v.x][v.y][v.z]||vis[v.x][v.y][v.z]) continue; else { vis[v.x][v.y][v.z]=1;//记录搜过的路 num[v.x][v.y][v.z]=num[d.x][d.y][d.z]+1; q[r++]=v; } } } } return -1; } int main() { int t; scanf("%d",&t);//几组测试数据 while(t--) { memset(num,0,sizeof(num)); memset(vis,0,sizeof(vis)); 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",&maps[i][j][k]); } } } printf("%d\n",bfs()); } return 0; }
END!!!!!!!!!!!!!!!!!!!
相关文章推荐
- STM32学习笔记之独立看门狗(IWDG)的使用
- The Review For PostGraduate No.16
- CVPR2016论文+code
- JavaScript事件知识点总结
- nil,null,NsNull
- Linux 普通进程 后台进程 守护进程
- 聊聊高并发系统限流特技-2
- js 学习基础 随机生成表格 颜色随机
- iOS 25个性能优化/内存优化常用方法
- HDU——1045Fire Net(最大匹配)
- 比较ascill码表后排序
- jQuery之动画介绍
- svn for mac 的注意事项
- (OK) Android 添加 开机启动 脚本
- cocos2dx学习之路----第七篇(坐标系统中本地坐标与世界坐标的转换详解)
- Num73 投资管理_简单分页查询&多条件分页
- Merge Sorted Array
- 工作中常用的Linux命令(不断更新中)
- RxAndroid 与OkHttpClient打造下载实例
- linux 入门 - 双系统的安装&JDK环境配置&Android Studio 的安装使用