同样写了一个水水的三维宽搜,可惜时间巨多,而且卡c++,T@@T!点击打开链接
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#define N 100
using namespace std;
int x2,y2,z2,t;
int map[N][N][N];
int jump[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
struct node
{
int x,y,z,s;
}q,r,p;
void init()
{
int i,j,k;
cin>>x2>>y2>>z2>>t;
for(i=1;i<=x2;i++)
{
for(j=1;j<=y2;j++)
{
for(k=1;k<=z2;k++)
cin>>map[i][j][k];
}
}
}
int is_b(node p)
{
if(p.x<=0 || p.y<=0 || p.z<=0 || p.x>x2 || p.y>y2
|| p.z>z2 || map[p.x][p.y][p.z]==1 || p.s>t)
return 1;
return 0;
}
int bfs()
{
int i;
q.s=0;
q.x=q.y=q.z=1;
map[0][0][0]=1;
queue< node > que;
que.push(q);
while(!que.empty())
{
r=que.front();que.pop();
if(r.x==x2 && r.y==y2 && r.z==z2 && r.s<=t)
return r.s;
for(i=0;i<6;i++)
{
p.s=r.s+1;
p.x=r.x+jump[i][0];
p.y=r.y+jump[i][1];
p.z=r.z+jump[i][2];
if(is_b(p)) continue;
map[p.x][p.y][p.z]=1;
que.push(p);
}
}
return -1;
}
int main ()
{
//freopen("mg.txt","r",stdin);
ios::sync_with_stdio(false);
int cases;
cin>>cases;
while(cases--)
{
init();
if(x2+y2+z2>t){cout<<-1<<endl;continue;}
int w=bfs();
if(w>t) cout<<-1<<endl;
else cout<<w<<endl;
}
return 0;
}