您的位置:首页 > 其它

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!!!!!!!!!!!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: