zoukankan      html  css  js  c++  java
  • [ACM] hdu 1253 胜利大逃亡 (三维BFS)

    胜利大逃亡



    Problem Description
    Ignatius被魔王抓走了,有一天魔王出差去了,这但是Ignatius逃亡的好机会.

    魔王住在一个城堡里,城堡是一个A*B*C的立方体,能够被表示成A个B*C的矩阵,刚開始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,如今知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的当中一个.如今给你城堡的地图,请你计算出Ignatius是否能在魔王回来前离开城堡(仅仅要走到出口就算离开城堡,假设走到出口的时候魔王刚好回来也算逃亡成功),假设能够请输出须要多少分钟才干离开,假设不能则输出-1.


     

    Input
    输入数据的第一行是一个正整数K,表明測试数据的数量.每组測试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块......),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,当中0代表路,1代表墙.(假设对输入描写叙述不清楚,能够參考Sample Input中的迷宫描写叙述,它表示的就是上图中的迷宫)

    特别注意:本题的測试数据很大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.
     

    Output
    对于每组測试数据,假设Ignatius可以在魔王回来前离开城堡,那么请输出他最少须要多少分钟,否则输出-1.
     

    Sample Input
    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
     

    Sample Output
    11
     

    Author
    Ignatius.L


    解题思路:

    方体的迷宫,从(1,1,1)要求走到(a,b,c)。也就是从一个角走到对角,能够向上下左右前后六个方向走。地图用0,1表示,0表示可走。1表示有墙不可走。

    求最短步数。

    这个是二维BFS的扩展。注意方向改为6个就能够了,其他的和二维BFS没什么差别。

    代码:

    #include <iostream>
    #include <queue>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    int mp[55][55][55];
    int step[55][55][55];
    bool vis[55][55][55];
    int dx[6]={0,1,-1,0,0,0};//六个方向。上下左右前后
    int dy[6]={1,0,0,-1,0,0};
    int dz[6]={0,0,0,0,1,-1};
    int a,b,c,t;
    int k;
    struct Node
    {
        int x,y,z;
    }node;
    
    bool judge(int x,int y,int z)
    {
        if(x>=1&&x<=a&&y>=1&&y<=b&&z>=1&&z<=c&&!vis[x][y][z]&&mp[x][y][z]==0)
            return true;
        return false;
    }
    
    int bfs()
    {
        memset(vis,0,sizeof(vis));
        vis[1][1][1]=1;
        step[1][1][1]=0;
        queue<Node>q;
        Node s,r;
        s.x=1,s.y=1,s.z=1;
        q.push(s);
        while(!q.empty())
        {
            r=q.front();
            q.pop();
            for(int i=0;i<6;i++)
            {
                int xx=r.x+dx[i];
                int yy=r.y+dy[i];
                int zz=r.z+dz[i];
                if(judge(xx,yy,zz))
                {
                    vis[xx][yy][zz]=1;
                    s.x=xx,s.y=yy,s.z=zz;
                    step[xx][yy][zz]=step[r.x][r.y][r.z]+1;
                    if(xx==a&&yy==b&&zz==c)
                        return step[xx][yy][zz];//找到返回
                    q.push(s);
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        scanf("%d",&k);
        while(k--)
        {
            scanf("%d%d%d%d",&a,&b,&c,&t);
            for(int i=1;i<=a;i++)
                for(int j=1;j<=b;j++)
                    for(int k=1;k<=c;k++)
                        scanf("%d",&mp[i][j][k]);
            int time=bfs();
            if(time>=0&&time<=t)
                printf("%d
    ",time);
            else
                printf("-1
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7364596.html
Copyright © 2011-2022 走看看