hdu A计划

这道题是一道bfs的题目,因为题目中给的数据很小,所以可以采用优先队列的方式来简化处理。这道题在搜索的过程中要注意map1的不同层次的转换,即对‘#‘的理解。之前wa了两次是因为我考虑了如果上下两层对应位置都是‘#‘时输出‘NO’,但是这是错误的,可以不考虑这个问题,也可以当上下两层都是‘#’时将它们赋成‘*’;

具体步骤看程序及程序上的注释:

#include"iostream"
#include"stdio.h"
#include"cmath"
#include"string.h"
#include"queue"
#include"algorithm"
#define mx 15
using namespace std;
char map1[mx][mx][2];//三维的地图
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};//上下左右四个方向
int n,m,t,sx,sy,sz,ex,ey,ez;
struct node
{
    int x,y,z,time;
    friend bool operator<(node a,node b)//优先队列中的元素按时间的从小到大排序
    {
        return b.time<a.time;
    }
};
int judge(int x,int y,int z)//判断当前位置的情况
{
    if(x>=0&&x<n&&y>=0&&y<m)
    {
        if(map1[x][y][z]==‘.‘) return 0;
        else if(map1[x][y][z]==‘#‘) return 1;
        else return -1;
    }
    else return -1;
}
void bfs()
{
    priority_queue<node> q;//构造优先队列
    node cur,next;
    int i;
    cur.x=sx;
    cur.y=sy;
    cur.z=sz;
    cur.time=0;
    q.push(cur);
    while(!q.empty())//队列非空就进行循环
    {
        cur=q.top();
        q.pop();//记得出队列
        if(cur.x==ex&&cur.y==ey&&cur.z==ez&&cur.time<=t)//找到了目标位置就输出并返回
            {cout<<"YES"<<endl;return;}
        for(i=0;i<4;i++)
        {
            next.x=cur.x+dir[i][0];
            next.y=cur.y+dir[i][1];
            next.z=cur.z;
            int re=judge(next.x,next.y,next.z);//判断走过一步后的情况
            if(re==-1) continue;
            else
            {
                if(re==0)
               {
                map1[next.x][next.y][next.z]=‘*‘;
                next.time=cur.time+1;
                q.push(next);
               }
               else if(re==1)
               {
                    next.z=(cur.z+1)%2;
                    re=judge(next.x,next.y,next.z);//判断时空隧道的对应位置是什么
                    if(re==0)
                        { next.time=cur.time+1;map1[next.x][next.y][next.z]=‘*‘;q.push(next);}
               }
            }
        }
    }
    cout<<"NO"<<endl;
}
int main()
{
    int c;
    cin>>c;
    while(c--)
    {
        int i,j,k;
        cin>>n>>m>>t;
        for(k=0;k<=1;k++)
        {
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    cin>>map1[i][j][k];
                    if(map1[i][j][k]==‘S‘)
                    {
                        sx=i;sy=j;sz=k;
                        map1[i][j][k]=‘*‘;
                    }
                    else if(map1[i][j][k]==‘P‘)
                    {
                        map1[i][j][k]=‘.‘;
                        ex=i;ey=j;ez=k;
                    }
                }
            }
            if(k==0)getchar();////注意在输入过程中的空格
        }
        bfs();
    }
    return 0;
}

时间: 2024-10-07 05:16:40

hdu A计划的相关文章

hdu 4502 吉哥系列故事——临时工计划

吉哥系列故事--临时工计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2921    Accepted Submission(s): 1128 Problem Description 俗话说一分钱难倒英雄汉,高中几年下来,吉哥已经深深明白了这个道理,因此,新年开始存储一年的个人资金已经成了习惯,不过自从大学之后他不好意思再向大人要

HDU 2102 A计划 BFS

点击打开链接 A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10939    Accepted Submission(s): 2667 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的

hdu 6118 度度熊的交易计划(可行费用流)

题目链接:hdu 6118 度度熊的交易计划 题意: 中文,说的很清楚了. 题解: 对着输入建一些图,跑一下可行费用流就行了,即当费用为正的时候就不跑了,这样就先满足了费用最小. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=(a);i<=(b);++i) 3 using namespace std; 4 5 namespace MCMF 6 { 7 const int N=1e5+7,inf=1e9+7; 8 int u[

HDU 1005 A计划

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出. 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位

hdu 2102 A计划(双层BFS)(详解)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她

HDU 4502 吉哥系列故事——临时工计划(DP)

Problem Description 俗话说一分钱难倒英雄汉,高中几年下来,吉哥已经深深明白了这个道理,因此,新年开始存储一年的个人资金已经成了习惯,不过自从大学之后他不好意思再向大人要压岁钱了,只能把唯一的希望放到自己身上.可是由于时间段的特殊性和自己能力的因素,只能找到些零零碎碎的工作,吉哥想知道怎么安排自己的假期才能获得最多的工资. 已知吉哥一共有m天的假期,每天的编号从1到m,一共有n份可以做的工作,每份工作都知道起始时间s,终止时间e和对应的工资c,每份工作的起始和终止时间以天为单位

HDU 2102 A计划 (BFS)

A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15463    Accepted Submission(s): 3859 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.

HDU 2102 A计划 (深搜)

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出. 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位

hdu 2102 A计划 (bfs+队列)

A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9360    Accepted Submission(s): 2265 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.