简单的bfs。。
没啥好说的。。
#include<stdio.h>
#include<string.h>
int l,r,c;
char map[35][35][35];
int way[35][35][35];
struct sb
{
int l;
int r;
int c;
}s,e;
int move[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
int queue[100010];
int bfs()
{
int front=0;
int end=0;
queue[end++]=s.l;
queue[end++]=s.r;
queue[end++]=s.c;
while(end!=front)
{
int oldl=queue[front++];
int oldr=queue[front++];
int oldc=queue[front++];
for(int i=0;i<6;i++)
{
int newl=oldl+move[i][0];
int newr=oldr+move[i][1];
int newc=oldc+move[i][2];
if(newl>=0&&newl<l&&newr>=0&&newr<r&&newc>=0&&newc<c)
{
if(map[newl][newr][newc]!='#'&&way[newl][newr][newc]==0)
{
way[newl][newr][newc]=way[oldl][oldr][oldc]+1;
queue[end++]=newl;
queue[end++]=newr;
queue[end++]=newc;
}
}
}
}
return way[e.l][e.r][e.c];
}
int main()
{
while(scanf("%d%d%d",&l,&r,&c)!=EOF)
{
if(l==0&&r==0&&c==0)
break;
int flags=0;
int flage=0;
for(int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
scanf("%s",map[i][j]);
for(int k=0;k<c;k++)
{
if(flags==0&&map[i][j][k]=='S')
{
s.l=i;
s.r=j;
s.c=k;
flags=1;
}
if(flage==0&&map[i][j][k]=='E')
{
e.l=i;
e.r=j;
e.c=k;
flage=1;
}
}
}
}
memset(way,0,sizeof(way));
int ans=bfs();
if(ans!=0)
printf("Escaped in %d minute(s).\n",ans);
else
printf("Trapped!\n");
}
return 0;
}
另外用函数做bfs。。 感觉简明一点。。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int l,r,c;
char map[35][35][35];
int way[35][35][35];
struct sb
{
int l;
int r;
int c;
}s,e;
int move[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
queue<int>Q;
int bfs()
{
Q.push(s.l);
Q.push(s.r);
Q.push(s.c);
while(!Q.empty())
{
int oldl=Q.front();
Q.pop();
int oldr=Q.front();
Q.pop();
int oldc=Q.front();
Q.pop();
for(int i=0;i<6;i++)
{
int newl=oldl+move[i][0];
int newr=oldr+move[i][1];
int newc=oldc+move[i][2];
if(newl>=0&&newl<l&&newr>=0&&newr<r&&newc>=0&&newc<c)
{
if(map[newl][newr][newc]!='#'&&way[newl][newr][newc]==0)
{
way[newl][newr][newc]=way[oldl][oldr][oldc]+1;
Q.push(newl);
Q.push(newr);
Q.push(newc);
}
}
}
}
return way[e.l][e.r][e.c];
}
int main()
{
while(scanf("%d%d%d",&l,&r,&c)!=EOF)
{
if(l==0&&r==0&&c==0)
break;
int flags=0;
int flage=0;
for(int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
scanf("%s",map[i][j]);
for(int k=0;k<c;k++)
{
if(flags==0&&map[i][j][k]=='S')
{
s.l=i;
s.r=j;
s.c=k;
flags=1;
}
if(flage==0&&map[i][j][k]=='E')
{
e.l=i;
e.r=j;
e.c=k;
flage=1;
}
}
}
}
memset(way,0,sizeof(way));
int ans=bfs();
if(ans!=0)
printf("Escaped in %d minute(s).\n",ans);
else
printf("Trapped!\n");
}
return 0;
}
结果时间反而变长了,但是内存小了。。。
最后的是结构体的代码
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int l,r,c;
char map[35][35][35];
int way[35][35][35];
struct node
{
int l;
int r;
int c;
}s,e;
int move[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
queue<node>Q;
int bfs()
{
Q.push(s);
while(!Q.empty())
{
node old=Q.front();
Q.pop();
for(int i=0;i<6;i++)
{
node new1;
new1.l=old.l+move[i][0];
new1.r=old.r+move[i][1];
new1.c=old.c+move[i][2];
if(new1.l>=0&&new1.l<l&&new1.r>=0&&new1.r<r&&new1.c>=0&&new1.c<c)
{
if(map[new1.l][new1.r][new1.c]!='#'&&way[new1.l][new1.r][new1.c]==0)
{
way[new1.l][new1.r][new1.c]=way[old.l][old.r][old.c]+1;
Q.push(new1);
}
}
}
}
return way[e.l][e.r][e.c];
}
int main()
{
while(scanf("%d%d%d",&l,&r,&c)!=EOF)
{
if(l==0&&r==0&&c==0)
break;
int flags=0;
int flage=0;
for(int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
scanf("%s",map[i][j]);
for(int k=0;k<c;k++)
{
if(flags==0&&map[i][j][k]=='S')
{
s.l=i;
s.r=j;
s.c=k;
flags=1;
}
if(flage==0&&map[i][j][k]=='E')
{
e.l=i;
e.r=j;
e.c=k;
flage=1;
}
}
}
}
memset(way,0,sizeof(way));
int ans=bfs();
if(ans!=0)
printf("Escaped in %d minute(s).\n",ans);
else
printf("Trapped!\n");
}
return 0;
}
这个字数最少。。。我喜欢!