• Algorithm Design——广度优先搜索


      1  /**
      2 题目描述: Ignatius 被魔王抓走了,有一天魔王出差去了,这可是 Ignatius 逃亡的好机会.
      3 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩 阵,刚开始 
      4 Ignatius 被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现 在知道魔王将
      5 在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个 坐标中的其中一个.
      6 现在给你城堡的地图,请你计算出 Ignatius 能否在魔王回来前 离开城堡
      7 (只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃
      8 亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1。 
      9 
     10 输入:
     11 输入数据的第一行是一个正整数 K,表明测试数据的数量.每组测试数据的第一行是四个正
     12 整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的
     13 时间.然后是 A 块输入数据(先是第 0 块,然后是第 1 块,第 2 块......),每块输入数据有B行,
     14 每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙。 
     15 
     16 输出:
     17 对于每组测试数据,如果 Ignatius 能够在魔王回来前离开城堡,那么请输出他最少需要
     18 多少分钟,否则输出-1.
     19 
     20 样例输入: 
     21 1
     22 3 3 4 20 
     23 0 1 1 1
     24 0 0 1 1 
     25 0 1 1 1 
     26 1 1 1 1
     27 1 0 0 1 
     28 0 1 1 1 
     29 0 0 0 0 
     30 0 1 1 0 
     31 0 1 1 0
     32 */
     33 #include<cstdio>
     34 #include<queue>
     35 using namespace std;
     36 
     37 bool mark[50][50][50];//标记数组
     38 int maze[50][50][50];//存储立方体信息
     39 struct N//状态结构体
     40 {
     41     int x, y, z;
     42     int t;
     43 };
     44 
     45 queue<N> Q;//队列,队列中的元素是状态
     46 int go[][3] = 
     47 {
     48     1, 0, 0,
     49     -1, 0, 0,
     50     0, 1, 0,
     51     0, -1, 0,
     52     0, 0, 1,
     53     0, 0, -1
     54 };
     55 
     56 //广度优先搜索,返回其最少耗时
     57 int BFS(int a, int b, int c)
     58 {
     59     while(Q.empty() == false)//当队列中仍有元素可以扩展时循环
     60     {
     61         N now = Q.front();//得到队头状态
     62         Q.pop();//弹出队头状态
     63 
     64         for(int i = 0 ; i < 6 ; i ++)//以此扩展其留个相邻节点
     65         {
     66             int nx = now.x + go[i][0];
     67             int ny = now.y + go[i][1];
     68             int nz = now.z + go[i][2];
     69 
     70             if(nx < 0 || nx >= a || ny < 0 || ny >= b || nz < 0 || nz >= c)//越界
     71                 continue;
     72 
     73             if(maze[nx][ny][nz] == 1)//路障
     74                 continue;
     75 
     76             if(mark[nx][ny][nz] == true)//已走过
     77                 continue;
     78 
     79             N tmp;//新状态
     80             tmp.x = nx;
     81             tmp.y = ny;
     82             tmp.z = nz;
     83             tmp.t = now.t + 1;//时间+1
     84             Q.push(tmp);
     85             mark[nx][ny][nz] = true;//标记该点
     86             if(nx == a - 1 && ny == b - 1 && nz == c - 1)//走到终点,返回耗时
     87                 return tmp.t;
     88         }
     89     }
     90 
     91     return  -1;
     92 }
     93 
     94 int main()
     95 {
     96     int T;
     97     scanf_s("%d", &T);//测试样例的个数
     98     while(T --)
     99     {
    100         int a, b, c, t;
    101         scanf_s("%d%d%d%d", &a, &b, &c, &t);//迷宫大小以及限时
    102         for(int i = 0 ; i < a ; i ++)
    103         {
    104             for(int j = 0 ; j < b ; j ++)
    105             {
    106                 for(int k = 0 ; k < c ; k ++)
    107                 {
    108                     scanf_s("%d", &maze[i][j][k]);//迷宫输入
    109                     mark[i][j][k] = false;
    110                 }
    111             }
    112         }
    113 
    114         while(Q.empty() == false)//清除上次痕迹
    115             Q.pop();
    116 
    117         mark[0][0][0] = true;
    118         N tmp;
    119         tmp.t = tmp.x = tmp.y = tmp.z = 0;//初始状态
    120         Q.push(tmp);//将初始状态放入队列
    121         int rec = BFS(a, b, c);//广度优先搜索
    122 
    123         if(rec <= t)
    124             printf_s("%d
    ", rec);//如果所用时间小于限时,打印时间
    125         else
    126             printf_s("-1
    ");
    127     }
    128 
    129     return 0;
    130 }
  • 相关阅读:
    OSS系列【springboot集成Minio】
    Linux系列【使用LVM对目录进行扩容】
    Linux系列【使用lvm对磁盘进行分区管理】
    Linux系列【根目录空间满了,如何快速扩容?】
    开发工具系列【finalshell连接时间长了,忘记密码,如何查看密码?】
    OSS系列【java调用Minio实现文件上传下载】
    Linux系列【解决vi命令不能用的问题】
    Linux系列【linux下boot目录满了怎么清理?】
    OSS系列【centos7单机搭建Minio】
    Windows系列【win10桌面的文件夹无法拖动,怎么办?】
  • 原文地址:https://www.cnblogs.com/yiyi-xuechen/p/3452336.html
Copyright © 2020-2023  润新知