你现在处于一栋楼里的'S'的起始位置,'#'是墙壁,'.'是路,'E'是重点,'U'的楼梯代表你可以上去一层,'D'的楼梯代表你可以下去一层(保证上去跟下去的地方不会是墙壁)。请你告诉我至少要多少步才能到达终点,当然有可能去不到重点,这时请输出"Trapped!"
你现在处于一栋楼里的'S'的起始位置,'#'是墙壁,'.'是路,'E'是重点,'U'的楼梯代表你可以上去一层,'D'的楼梯代表你可以下去一层(保证上去跟下去的地方不会是墙壁)。请你告诉我至少要多少步才能到达终点,当然有可能去不到重点,这时请输出"Trapped!"
输入一个L、N、M,L代表层数,N,代表每层的长,M代表每层的宽。接下来有L个N*M的图形,代表从第1层到第L层的地图。保证 L,N,M均不大于50
输入最小要多少步才能到终点,如果出不去,请输出"Trapped!"。
3 5 5
S...U
#####
..###
....U
#####.....
.####
..###
D###U
#####.....
.####
..###
###E.
#####1 3 3
S.#
##E
###
20
Trapped!
ControlBear
题解:
不是很难的一道bfs题,处理起来有点麻烦而已
代码:
#include<iostream>
#include<stdio.h>
#include<map>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
using namespace std;
char p[55][55][55];//存图
int vis[55][55][55];//遍历数组
int dirx[4]={0,0,-1,1};
int diry[4]={1,-1,0,0};
int l,n,m;
int sc,sx,sy,ec,ex,ey;//存起始点坐标
struct node
{int c,x,y;int step;
};
queue<node>q;
int main()
{int i,j,k,tag,s;node now,next;while(scanf("%d%d%d",&l,&n,&m)!=EOF){while(!q.empty())q.pop();for(i=0;i<l;i++){for(j=0;j<n;j++)memset(vis[i][j],0,sizeof(vis[0][0][0])*(m+1));//初始化}for(i=0;i<l;i++){for(j=0;j<n;j++){scanf("%s",p[i][j]);for(k=0;k<m;k++){if(p[i][j][k]=='S'){sx=j;sy=k;sc=i;}else if(p[i][j][k]=='E'){ex=j;ey=k;ec=i;}}}}now.c=sc,now.step=0,now.x=sx,now.y=sy;tag=0;q.push(now);vis[sc][sx][sy]=1;while(!q.empty())//日常宽搜{now=q.front();q.pop();if(now.c==ec&&now.x==ex&&now.y==ey){s=now.step;tag=1;break;}if(p[now.c][now.x][now.y]=='D'){if(now.c-1>=0&&!vis[now.c-1][now.x][now.y]){vis[now.c-1][now.x][now.y]=1;next=now;next.c--;next.step++;q.push(next);}}else if(p[now.c][now.x][now.y]=='U'){if(now.c+1<l&&!vis[now.c+1][now.x][now.y]){vis[now.c+1][now.x][now.y]=1;next=now;next.c++;next.step++;q.push(next);}}for(i=0;i<4;i++){int xx=dirx[i]+now.x;int yy=diry[i]+now.y;if(xx>=0&&xx<n&&yy>=0&&yy<m&&!vis[now.c][xx][yy]&&p[now.c][xx][yy]!='#'){vis[now.c][xx][yy]=1;next.x=xx;next.y=yy;next.c=now.c;next.step=now.step+1;q.push(next);}}}if(tag)printf("%d\n",s);elseprintf("Trapped!\n");}return 0;
}