二维:
#include<stdio.h>
#include<string.h>
struct l
{
int x;int y;int s;
}lp[3000];
int a[51][51],book[51][51];
int bu[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int head,tail;
int main()
{
int m,n,startx,starty,p,q,tx,ty,flog;
while(~scanf("%d %d",&m,&n))
{
memset(a,0,sizeof a);
memset(book,0,sizeof book);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
scanf("%d %d %d %d",&startx,&starty,&p,&q);
//****
head=1;tail=1;
lp[tail].x=startx;
lp[tail].y=starty;
lp[tail].s=0;
tail++;
book[startx][starty]=1;
flog=0;
//****
while(head<tail)
{
for(int i=0;i<3;i++){
tx=lp[head].x+bu[i][0];
ty=lp[head].y+bu[i][1];
if(tx<1||tx>m||ty<1||ty>n)
continue;
if(a[tx][ty]==0&&book[tx][ty]==0)
{
book[tx][ty]=1;
lp[tail].x=tx;
lp[tail].y=ty;
lp[tail].s=lp[head].s+1;
tail++;///
}
if(tx==p&&ty==q)
{
flog=1;
break;
}
}
if(flog==1)
break;
head++;///
}
printf("%d\n",lp[tail-1].s);
}
}
三维:
魔王住在一个城堡里,城堡是一个ABC的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.
Input
输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块…),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙.tput对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.
Sample
Input
1
3 3 4 20
0 1 1 1
0 0 1 1
0 1 1 1
1 1 1 1
1 0 0 1
0 1 1 1
0 0 0 0
0 1 1 0
0 1 1 0
Sample Output
11
#include<stdio.h>
#include<string.h>
struct l
{
int x;int y;int z;int s;
}lp[625555];
int bu[6][3]={{0,-1,0},{0,1,0},{0,0,-1},{0,0,1},{-1,0,0},{1,0,0}};
int a[55][55][55];
int book[55][55][55];
int main()
{
int hang,lie,gao,i,j,k,n,s,f,s1;
scanf("%d",&n);
while(n--)
{
memset(book,0,sizeof book);
f=0;
scanf("%d %d %d %d",&gao,&hang,&lie,&s1);
for(i=0;i<gao;i++)
for(j=0;j<hang;j++)
for(k=0;k<lie;k++)
scanf("%d",&a[i][j][k]);
//****
int head,tail,tx,ty,tz;
head=1;tail=1;
lp[head].x=0;
lp[head].y=0;
lp[head].z=0;
lp[head].s=0;
book[0][0][0]=1;
tail++;///
//****
while(head<tail)
{
for(i=0;i<6;i++){
tz=lp[head].z+bu[i][0];
tx=lp[head].x+bu[i][1];
ty=lp[head].y+bu[i][2];
if(a[tz][tx][ty]||book[tz][tx][ty]||tx<0||tx>=hang||ty<0||ty>=lie||tz<0||tz>=gao)
continue;
if(a[tz][tx][ty]==0&&book[tz][tx][ty]==0)
{
book[tz][tx][ty]=1;
lp[tail].z=tz;
lp[tail].x=tx;
lp[tail].y=ty;
lp[tail].s=lp[head].s+1;
}
if((tz==gao-1)&&(tx==hang-1)&&(ty==lie-1))
{
f=1;
break;
}
tail++;///
}
head++;///
if(f)
break;
}
if(f==1&&lp[tail].s<=s1)
printf("%d\n",lp[tail].s);
else
printf("-1\n");
}
}
无论是二维还是三维,最主要的是定首尾,取方向,要注意head++,tail++