胜利大逃亡
原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=1253
思路:利用bfs进行广搜,不过最让人蛋疼的是起点可以是墙,出点也可能为墙,觉得这样出题没什么意思,虽然坑了像我这样的菜鸟。。。自己用c写了一个,不过一直错了将近20多次,后来又自学了stl的队列,一下就过了。。。。
利用stl的queue队列写的AC代码:
#include<queue>
#include <iostream>
#include"cstring"
#include"cstdio"
using namespace std;
int map[51][51][51],v[51][51][51],newx[6]={0,0,0,0,-1,1},newy[6]={-1,0,1,0,0,0},newz[6]={0,-1,0,1,0,0};
typedef struct node
{
int x,y,z;
int step;
}chao;
void bfs(int x,int y,int z,int t)
{
node from,to;
queue <chao> q;
from.x=from.y=from.z=from.step=0;
memset(v,0,sizeof(v));
q.push(from);
v[0][0][0]=1;
while(!q.empty())
{
from=q.front();
q.pop();
if(from.step>t)//||(x-from.x+y-from.y+z-from.z-3)>t)
break;
if(from.x==x-1&&from.y==y-1&&from.z==z-1)
{
printf("%d\n",from.step);
return ;
}
for(int i=0;i<6;i++)
{
to.x=from.x+newx[i];
to.y=from.y+newy[i];
to.z=from.z+newz[i];
if(to.x>=0&&to.x<x&&to.y>=0&&to.y<y&&to.z>=0&&to.z<z&&!map[to.x][to.y][to.z]&&!v[to.x][to.y][to.z])
{
to.step=from.step+1;
q.push(to);
v[to.x][to.y][to.z]=1;
}
}
}
printf("-1\n");
}
int main()
{
int x,y,z,i,j,k,t,n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d%d",&x,&y,&z,&t);
for(i=0;i<x;i++)
for(j=0;j<y;j++)
for(k=0;k<z;k++)
scanf("%d",&map[i][j][k]);
if(map[x-1][y-1][z-1]==1||x+y+z-3>t)//剪枝,x+y+z-3为假设可以到达出口的最小步数,如果连它都大于那就。。。
printf("-1\n");
else
bfs(x,y,z,t);
}
return 0;
}
以下是自己用c写的错误代码,恳请大牛们指点哪里出错了:
#include"stdio.h"
#include"string.h"
int map[53][53][53],i,j,k,n,x,y,z,t,step[125010],q1[125010],q2[125010],q3[125010];
int v[53][53][53],flat,x2,y2,z2,newx[6]={0,0,0,0,-1,1},newy[6]={-1,0,1,0,0,0},newz[6]={0,-1,0,1,0,0};
int main()
{
int x1,y1,z1,to,from;
scanf("%d",&n);
while(n--)
{
flat=0;
scanf("%d%d%d%d",&x2,&y2,&z2,&t);
memset(step,0,sizeof(step));
memset(v,0,sizeof(v));
for(i=0;i<x2;i++)
for(j=0;j<y2;j++)
for(k=0;k<z2;k++)
scanf("%d",&map[i][j][k]);
if(map[x2-1][y2-1][z2-1]==1||map[0][0][0]==1||x2+y2+z2-3>t)
flat=0;
else
{
from=0;to=0;
q1[to]=q2[to]=q3[to++]=0;
while(from<to)
{
x=q1[from];
y=q2[from];
z=q3[from++];
v[x][y][z]=1;
if(step[from-1]>t)
break;
if(x==x2-1&&y==y2-1&&z==z2-1)
{
flat=1;
printf("%d\n",step[from-1]);
break;
}
for(k=0;k<6;k++)
{
x1=newx[k]+x;
y1=newy[k]+y;
z1=newz[k]+z;
if(x1>=0&&x1<x2&&y1>=0&&y1<y2&&z1>=0&&z1<z2&&!map[x1][y1][z1]&&!v[x1][y1][z1])
{
step[to]=step[from-1]+1;
q1[to]=x1;
q2[to]=y1;
q3[to++]=z1;
}
}
}
}
if(!flat)
printf("-1\n");
}
return 0;
}