hdu 杭电 1253 胜利大逃亡

题意:从,左上后角->右上前角,的最短时间是否满足题目给出的时间,满足输出最短时间,否输出-1.

      输入数据比较难理解:

      A B C可以理解为对应输入的A->x轴的单位长度,B->z轴的单位长度(方向向向下),C->y轴的单位长度.

      注:左上后角作为坐标原点。



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

//第三块

 

解法:广搜,队列

 

峰注:进队列后必须马上标记。

 

ac代码:

View Code
#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;

struct node
{
    int x,y,z;    
    int t;
};


const int m=51;
int x,y,z,t;
int map[m][m][m],dir[6][3]={ 0, 0, 1,
0, 0,-1,
0, 1, 0,
0,-1, 0,
1, 0, 0,
-1, 0, 0}; //正方体六个面的方向,注:z轴方向:向下
// 方向:下,上,右,左,前,后



int check(int i,int j,int k)      //判断是否出界,(即是否在正方体内)
{
    if(i>=0&&i<x&&j>=0&&j<y&&k>=0&&k<z)
    {
        return 1;
    }
    else
        return 0;
}


int main()
{
    queue<node>q;
    node temp;
    int n;
    int i,j,k;
    while(cin>>n)
    {
        for(int l=0;l<n;l++)
        {
            cin>>x>>y>>z>>t;

            for(i=0;i<x;i++)          //三个for()循环输入
            {
                for(j=0;j<y;j++)
                {
                    for(k=0;k<z;k++)
                    {
                        scanf("%d",&map[i][j][k]);
                    }
                }
            }


            temp.x=0;
            temp.y=0;
            temp.z=0;
            temp.t=0;
            q.push(temp);             //坐标原点进队列,初始化
            map[q.front().x][q.front().y][q.front().z]=1;  //特别注意:进队列后必须标记为墙


            while(!q.empty())
            {
                if(q.front().t<t&&q.front().x==x-1&&q.front().y==y-1&&q.front().z==z-1)
                {
                    cout<<q.front().t<<endl;
                    break;
                }         //(x-1,y-1,z-1)即右下前坐标,满足提前跳出循环



                for(int a=0;a<6;a++)   
                {
                    i=q.front().x+dir[a][0];
                    j=q.front().y+dir[a][1];
                    k=q.front().z+dir[a][2];
                    if(check(i,j,k))
                    {   
                        if(map[i][j][k]==0)
                        {
                            temp.x=i;
                            temp.y=j;
                            temp.z=k;
                            temp.t=q.front().t+1;
                            map[i][j][k]=1;         //特别注意:进队列后必须标记为墙
                            q.push(temp);
                        }
                    }
                }        //一个立方体有六个方向,第一个if()判断是否出界,
                //第二个if()判断是否为墙

                map[q.front().x][q.front().y][q.front().z]=1;
                q.pop();
            }

            if(q.empty())
                cout<<"-1"<<endl;
            else
            {
                while(!q.empty())
                {
                    q.pop();
                }
            }
        }//end-for()
    }//end-while
    return 0;
}








注:不懂请留言。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值