HDU 2102 A计划

本文介绍了一个迷宫救援问题的算法实现,通过广度优先搜索(BFS)策略在限定时间内找到公主的方法。考虑到特殊地形,例如时空传输机和墙壁的影响,并进行相应处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

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

分析:把特殊情况处理掉就好,

        ①上下都是 ‘#’    ②上面或下面一个是‘#‘ 一个是是’*‘ 

       那么上下都预处理成’*‘

View Code
#include <stdio.h>
#include <string.h>
#define clr(x) memset(x,0,sizeof(x))
#define INF 0x1f1f1f1f
int f[8] = {-1,1,0,0, 0,0,-1,1};
struct node
{
    int x,y,z;
}q[300],tt,in,st,en;
int v[2][11][11];
int step[2][11][11];
char g[2][11][11];
void init()
{
    memset(step,INF,sizeof(step));
}
int n, m, ti;
bool ok(int x,int y)
{
    if (x>=0 && x<n && y>=0 && y<m)
        return true;
    return false;
}
bool bfs()
{
    int front=0, rear=0;
    int i, j, k;
    q[rear++] = st;
    step[st.z][st.x][st.y] = 0;
    while (front < rear)
    {
        tt = q[front++];
        if (g[tt.z][tt.x][tt.y]=='P')
        {
            if (step[tt.z][tt.x][tt.y]<=ti)
                return true;
        }
        if (g[tt.z][tt.x][tt.y]!='#')
        {
            for (i=0; i<4; i++)
            {
                in.z = tt.z;
                in.x = tt.x+f[i];
                in.y = tt.y+f[i+4];
                if (ok(in.x,in.y) && g[in.z][in.x][in.y]!='*' && step[tt.z][tt.x][tt.y]+1<step[in.z][in.x][in.y])
                {
                    step[in.z][in.x][in.y] = step[tt.z][tt.x][tt.y]+1;
                    q[rear++] = in;
                }
            }
        }
        else
        {
            in = tt;
            in.z = (tt.z+1)%2;
            if (step[tt.z][tt.x][tt.y]<step[in.z][in.x][in.y])
            {
                step[in.z][in.x][in.y] = step[tt.z][tt.x][tt.y];
                q[rear++] = in;
            }
        }
    }
    return false;
}
int main()
{
    int t;
    int i, j, k;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d %d %d",&n,&m,&ti);
        init();
        for (k=0; k<2; k++)
        {
            for (i=0; i<n; i++)
            {
                scanf("%s",g[k][i]);
                for (j=0; j<m; j++)
                {
                    if (g[k][i][j] == 'S')
                        st.x = i,st.y = j,st.z=k;
                }
            }
        }
        for (i=0; i<n; i++)
            for (j=0; j<m; j++)
            {
               if ((g[0][i][j]=='#'&&g[1][i][j]=='#')
                 ||(g[0][i][j]=='#'&&g[1][i][j]=='*')
                 ||(g[0][i][j]=='*'&&g[1][i][j]=='#'))
                  g[0][i][j] = g[1][i][j] = '*';
            }
        if (bfs())
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/dream-wind/archive/2013/02/02/2889912.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值