杭电1253 超时的bfs...
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int mapp[51][51][51];
int dir[6][3]={{0,1,0},{0,-1,0},{0,0,1},{0,0,-1},{1,0,0},{-1,0,0}};
int visit[51][51][51];
int flag,time[125001],a,b,c,t,ret;
bool cmp(int x,int y)
{
return x>y;
}
void dfs(int z,int x,int y,int cont)
{
int i,j,k,zz,xx,yy;
if(z==a-1&&x==b-1&&y==c-1)
{
if(cont<=t)
{
flag=1;
time[ret++]=cont;
return;
}
}
if(cont>=t) return;
for(i=0;i<6;i++)
{
zz=z+dir[i][0];
xx=x+dir[i][1];
yy=y+dir[i][2];
if(visit[zz][xx][yy]==1||zz<0||zz>=a||xx<0||xx>=b||yy<0||yy>=c||mapp[zz][xx][yy]==1) continue;
cont++;
visit[zz][xx][yy]=1;
dfs(zz,xx,yy,cont);
visit[zz][xx][yy]=0;
}
}
int main()
{
int i,j,k,n;
cin>>n;
while(n--)
{
scanf("%d %d %d %d",&a,&b,&c,&t);
if(a==b==c==1)
{
cout<<"-1"<<endl;
continue;
}
if(a+b+c>t)
{
cout<<"-1"<<endl;
continue;
}
for(i=0;i<a;i++)
{
for(j=0;j<b;j++)
{
for(k=0;k<c;k++)
{
scanf("%d",&mapp[i][j][k]);
}
}
}
flag=0;
ret=0;
memset(visit,0,sizeof(visit));
memset(time,0,sizeof(time));
visit[0][0][0]=1;
dfs(0,0,0,0);
sort(time,time+ret,cmp);
if(flag==1) cout<<time[0]<<endl;
else cout<<"-1"<<endl;
}
return 0;
}