码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1253 胜利大逃亡

时间:2020-01-29 23:14:41      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:mes   nod   scanf   地图   include   front   turn   name   三维空间   

https://vjudge.net/problem/HDU-1253

题意:输入T组测试

每组测试输入 X,Y,Z,Time,X,YZ代表一个三维空间,Time表示魔王回来的时间

在三维空间中 1 代表墙,不可走,0代表路,可以走,每次向三维空间走一步,所

需时间 t+1,起始点是(0,0,0),终点是(x-1,y-1,z-1),若逃离所需时间t < Time

输出t,否则输出 -1.

题解:三维空间搜索 BFS。

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <queue>
using namespace std;
const int N = 55;
int t;
char mp[N][N][N];  //三维空间地图
int A,B,C,K;
int dir[6][3] = {  //六个方向
    {0,0,1},
    {1,0,0},
    {0,1,0},
    {-1,0,0},
    {0,0,-1},
    {0,-1,0}
};

struct node
{
    int x,y,z,time;
};
//判断方向是否合法 
bool inbound(int x,int l,int r)
{
    if(x < l || x >= r) return false;
    return true;
}
//裸BFS
void BFS(int xx,int yy, int zz, int tt)
{
    bool flag = true;
    node strat;
    strat.x = xx, strat.y = yy, strat.z = zz,strat.time = tt;
    queue<node> q;
    q.push(strat);
    while(!q.empty())
    {
        node now = q.front();
        q.pop();
        if(now.x == A-1 && now.y == B-1 && now.z == C-1)
        {
            if(now.time <= K)
                printf("%d\n",now.time);
            else
                printf("-1\n");
            flag = false;
          //  printf("%d\n",now.time);
        }

        for(int i = 0; i < 6; i++)  //六个方向扩展
        {
            node next;
            next.x = now.x + dir[i][0];
            next.y = now.y + dir[i][1];
            next.z = now.z + dir[i][2];
            next.time = now.time + 1;
            if((!inbound(next.x,0,A)) || (!inbound(next.y,0,B)) || (!inbound(next.z,0,C))) continue;
            if(mp[next.x][next.y][next.z] == ‘0‘)
            {
       //         printf("%d\n",next.time);
                mp[next.x][next.y][next.z] = ‘1‘;
                q.push(next);
            }
        }
    }
    if(flag) puts("-1");
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(mp,0,sizeof(mp));
        scanf("%d %d %d %d",&A,&B,&C,&K);
        for(int i = 0; i < A; i++)
            for(int j = 0; j < B; j++)
                for(int k = 0; k < C; k++)
                    scanf(" %c",&mp[i][j][k]);
        BFS(0,0,0,0);
    }
    return 0;
}

  

HDU 1253 胜利大逃亡

标签:mes   nod   scanf   地图   include   front   turn   name   三维空间   

原文地址:https://www.cnblogs.com/Edviv/p/12241563.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!