三维的,思路和以前的是一样的,不过最初没注意到head和rear没初始化,SF了好几次(我以为是数组开小了呢,一直开大100W都还是错,后来才发现。。。。。。)
那个用循环来控制情况的方法用着很爽,6种情况弄个循环搞定,呵呵,不错不错。。。
#include<stdio.h>
#include<string.h>
typedef struct
{
int s1[1000000];
int s2[1000000];
int s3[1000000];
}queue;
queue que;
int head,rear;
void In(int x,int y,int z)
{
que.s1[rear]=x;
que.s2[rear]=y;
que.s3[rear]=z;
rear++;
}
void Out(int *x,int *y,int *z)
{
*x=que.s1[head];
*y=que.s2[head];
*z=que.s3[head];
head++;
}
int isEmpty()
{
if(head==rear)
return 1;
else
return 0;
}
int main()
{
int i,j,k,v1,v2,v3,x1,y1,z1,x2,y2,z2,p1,p2,p3,m,temp;
int count[35][35][35],sta[35][35][35];
int t1[6]={0,0,0,0,1,-1};
int t2[6]={1,-1,0,0,0,0};
int t3[6]={0,0,1,-1,0,0};
char a[35][35][35];
scanf("%d%d%d",&v1,&v2,&v3);
while(!(v1==0&&v2==0&&v3==0))
{
getchar();
for(i=0;i<v1;i++)
{
for(j=0;j<v2;j++)
{
for(k=0;k<v3;k++)
{
scanf("%c",&a[i][j][k]);
sta[i][j][k]=0;
count[i][j][k]=0;
if(a[i][j][k]=='S')
{
x1=i,y1=j,z1=k;
}
if(a[i][j][k]=='E')
{
x2=i,y2=j,z2=k;
}
}
getchar();
}
getchar();
}
head=rear=0;
In(x1,y1,z1);
sta[x1][y1][z1]=1;
temp=1;
while(!isEmpty()&&temp)
{
Out(&p1,&p2,&p3);
for(m=0;m<6;m++)
{
i=p1+t1[m],j=p2+t2[m],k=p3+t3[m];
if(i>=0&&i<v1&&j>=0&&j<v2&&k>=0&&k<v3&&a[i][j][k]!='#'&&sta[i][j][k]==0)
{
count[i][j][k]=count[p1][p2][p3]+1;
sta[i][j][k]=1;
if(a[i][j][k]=='E')
{
printf("Escaped in %d minute(s).\n",count[i][j][k]);
temp=0;
break;
}
else
In(i,j,k);
}
}
}
if(temp)
printf("Trapped!\n");
scanf("%d%d%d",&v1,&v2,&v3);
}
return 0;
}