• 九度oj 题目1456:胜利大逃亡


    题目描述:

    Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.

    输入:

    输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块......),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙。

    输出:

    对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.

    样例输入:
    1
    3 3 4 20
    0 1 1 1
    0 0 1 1
    0 1 1 1
    1 1 1 1
    1 0 0 1
    0 1 1 1
    0 0 0 0
    0 1 1 0
    0 1 1 0 
    
    样例输出:
    11

    三维的迷宫
    用广度优先搜索
    代码如下
     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <queue>
     5 #include <iostream>
     6 using namespace std;
     7 
     8 int dir[][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
     9 int cubic[52][52][52];
    10 int tcnt[52][52][52];
    11 
    12 struct Point{
    13     int x, y, z, t;
    14     Point(int x, int y, int z, int t) {
    15         this->x = x, this->y = y, this->z = z, this->t = t;
    16     }
    17 };
    18 
    19 queue <Point> que;
    20 
    21 int main(int argc, char const *argv[])
    22 {
    23     int a,b,c,t;
    24     //freopen("input.txt","r",stdin);
    25     int K;
    26     while(scanf("%d",&K) != EOF) {
    27         while(K--) {
    28             scanf("%d %d %d %d",&a,&b,&c,&t);
    29             for(int i = 0; i < a; i++) {
    30                 for(int j = 0; j < b; j++) {
    31                     for(int k = 0; k < c; k++) {
    32                         scanf("%d",&cubic[i][j][k]);
    33                     }
    34                 }
    35             }
    36             while(!que.empty()) {
    37                 que.pop();
    38             }
    39             memset(tcnt, -1, sizeof(tcnt));
    40             Point O(0,0,0,0);
    41             que.push(O);
    42             int ans = -1;
    43             while(!que.empty()) {
    44                 Point p = que.front();que.pop();
    45                 int t0 = p.t;
    46                 if(t0 > t) {
    47                     continue;
    48                 }
    49                 if(p.x == a-1 && p.y == b-1 && p.z == c-1) {
    50                     ans = t0;
    51                     break;
    52                 }
    53                 for(int i = 0; i < 6; i++) {
    54                     int xt = p.x + dir[i][0];
    55                     int yt = p.y + dir[i][1];
    56                     int zt = p.z + dir[i][2];
    57                     int tt = t0 + 1;
    58                     if(xt < a && xt >= 0 && yt < b && yt >= 0 && zt < c && zt >= 0 && cubic[xt][yt][zt] == 0&& tcnt[xt][yt][zt] == -1) {
    59                         Point toAdd(xt,yt,zt,tt);
    60                         que.push(toAdd);
    61                         tcnt[xt][yt][zt] = tt;
    62                     }
    63                 }
    64             }
    65             printf("%d
    ", ans);    
    66         }
    67     }
    68         return 0;
    69 }
  • 相关阅读:
    背景图像固定(背景附着)
    css背景图片位置
    2.使用第三种方式做一个多线程操作 3. 使用线程池做一个1到100的偶数之和 4.写一遍生产者与消费者模式 5 写一个字符串的单例设置模式(未完成) 6. 写一个简单工厂着模式
    简单写写
    说说JSON和JSONP区别
    web前端常见的面试题,基础知识点
    优秀网页设计_优秀Web设计的69条设计原则
    PostCSS_自动处理css3属性前缀
    用lnmp架构部署wordpress网站详细步骤
    使用html+css+js实现简易计算器
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5873319.html
Copyright © 2020-2023  润新知