poj 1426Dungeon Master

//这个题目的思路是给我了三个参数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(.....);//这个是相关条件
}
//上面的这个是比较正统的方式了。也就是这个模板了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值