//这个题目的思路是给我了三个参数L R C 这三个分别代表的是层数,行 列,起点是S 终点是E 然后呢障碍是# 路是. 就是这个样子
//注意 :多组输入没有数据范围
//这个题目竟然是找最优路径我们可以使用这个bfs 用队列来写
#include <iostream>
#include <math.h>
#include <queue>
#include <vector>
#include <stdio.h>
#include <string.h>
#define ll long long
using namespace std;
struct A
{
int x,y,z;
};
queue<A>rood_1;//这个使用来进行这个bfs 的这个总体上来说的话还是比较好用的
int L,R,C;
char map_1[30][30][30];//这个使用来进行存储地图的
int cost_time[30][30][30];//这个是记录的花费的时间的
int main(){
cin>>L>>R>>C;
int i,j,k;
int x,y,z;
while(L&&R&&C){
//这个是判断是否是输入的是否用零的,因为大楼的话不可能又零的操作的,就是这个操作啦哈。
for(i=0;i<L;i++){
for(j=0;j<R;j++){
for(k=0;k<C;k++){
cin>>map_1[i][j][k];
cost_time[i][j][k]=100000;
if(map_1[i][j][k]=='S'){
x=i;
y=j;
z=k;
cost_time[i][j][k]=0;
//这几个就是这个我们的开始地点啦
//下面我需要加上一个权值哈哈。
}
}
}
}
//这个题目的数据量不是很大,不需要太细致了,永不到这个序列了。
//下面我要进行这个bfs了
while(!rood_1.empty()){
rood_1.pop();
}
A Start_place;
Start_place.x=x;
Start_place.y=y;
Start_place.z=z;
rood_1.push(Start_place);
int flag=0;
while(!rood_1.empty()){
//上面的empty 是当空队列的时候返回true
//因为不可以走对角线所以有6种走法
int x_1=rood_1.front().x;
int y_1=rood_1.front().y;
int z_1=rood_1.front().z;
if(map_1[x_1][y_1][z_1]=='E'){
cout<<"Escaped in "<<cost_time[x_1][y_1][z_1]<<" minute(s)."<<endl;
flag=1;
break;
}
if((x_1-1)>=0&&cost_time[x_1][y_1][z_1]+1<cost_time[x_1-1][y_1][z_1]&&map_1[x_1-1][y_1][z_1]!='#'){
cost_time[x_1-1][y_1][z_1]=cost_time[x_1][y_1][z_1]+1;
A middle_1;
middle_1.x=x_1-1;
middle_1.y=y_1;
middle_1.z=z_1;
rood_1.push(middle_1);
}
if((y_1-1)>=0&&cost_time[x_1][y_1][z_1]+1<cost_time[x_1][y_1-1][z_1]&&map_1[x_1][y_1-1][z_1]!='#'){
cost_time[x_1][y_1-1][z_1]=cost_time[x_1][y_1][z_1]+1;
A middle_1;
middle_1.x=x_1;
middle_1.y=y_1-1;
middle_1.z=z_1;
rood_1.push(middle_1);
}
if((x_1+1)<L&&cost_time[x_1][y_1][z_1]+1<cost_time[x_1+1][y_1][z_1]&&map_1[x_1+1][y_1][z_1]!='#'){
cost_time[x_1+1][y_1][z_1]=cost_time[x_1][y_1][z_1]+1;
A middle_1;
middle_1.x=x_1+1;
middle_1.y=y_1;
middle_1.z=z_1;
rood_1.push(middle_1);
}
if((y_1+1)<R&&cost_time[x_1][y_1][z_1]+1<cost_time[x_1][y_1+1][z_1]&&map_1[x_1][y_1+1][z_1]!='#'){
cost_time[x_1][y_1+1][z_1]=cost_time[x_1][y_1][z_1]+1;
A middle_1;
middle_1.x=x_1;
middle_1.y=y_1+1;
middle_1.z=z_1;
rood_1.push(middle_1);
}
if((z_1-1)>=0&&cost_time[x_1][y_1][z_1]+1<cost_time[x_1][y_1][z_1-1]&&map_1[x_1][y_1][z_1-1]!='#'){
cost_time[x_1][y_1][z_1-1]=cost_time[x_1][y_1][z_1]+1;
A middle_1;
middle_1.x=x_1;
middle_1.y=y_1;
middle_1.z=z_1-1;
rood_1.push(middle_1);
}
if((z_1+1)<C&&cost_time[x_1][y_1][z_1]+1<cost_time[x_1][y_1][z_1+1]&&map_1[x_1][y_1][z_1+1]!='#'){
cost_time[x_1][y_1][z_1+1]=cost_time[x_1][y_1][z_1]+1;
A middle_1;
middle_1.x=x_1;
middle_1.y=y_1;
middle_1.z=z_1+1;
rood_1.push(middle_1);
}
rood_1.pop();
}
if(flag==0)
cout<<"Trapped!"<<endl;
cin>>L>>R>>C;
}
return 0;
}
//上面是我的ac 代码
//下面我想说的是bfs 解决这个题目的时候呢通过向四周寻找能够找到最短路径,这个是优势而且,第一个找到的就是最段的路径,可以用于求最优问题
//bfs在一种求最短的情况下只能使用dfs ,为什么呢,是因为状态,这个bfs是需要存状态的,假如说开始有100000中状态,每一个状态下面也有100000呢么就是说逆序要开完100000*100000大小的二维数组,是不现实的,需要使用dfs,这个题目有一个倒水问题比较经典,后面会附上。
//我的这个bfs 的格式是由问题的,下面给大家附上一个标准版的BFS
queue<int>p;
int x;
while(!p.empty()){
x=p.front();
if(x.....)//这个是判断x是否满足{
break;
}
p.push(.....);//这个是相关条件
}
//上面的这个是比较正统的方式了。也就是这个模板了