【NOJ1147】【算法实验三】【分支限界法】木乃伊迷宫

本文介绍了一道算法题目——1147.木乃伊迷宫,讨论如何在6x6的迷宫中避开木乃伊并安全到达出口。木乃伊每步移动两格,优先尝试与玩家在同一列。文章提到了代码实现过程中的注意事项,包括墙的位置判断、木乃伊的移动逻辑以及在编程时遇到的错误和解决方案,如错误地在木乃伊抓到人时立即返回false,而应等待所有可能路径搜索完毕后再决定是否失败。

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


1147.木乃伊迷宫

时限:1000ms 内存限制:10000K  总时限:3000ms

描述

木乃伊地下宫殿是一个6行6列的迷宫。游戏在木乃伊所在的迷宫里展开,任务就是尽快赶到出口。你一次只能走一步,而木乃伊可以走两步,但木乃伊是很笨的,他总是先尽量跟你达到同一列,如果已经是同一列了,他才会向你走来,有墙的地方人和木乃伊都不能过,你可以利用障碍物牵制住木乃伊。

输入

先输入墙的数量n,然后在后续的n行里每行有3个数表示一堵墙,3个数分别为格子的行、列和墙的位置(0表示这个格子的下方是墙,1表示这个格子的右方是墙),再下来的3行每行2个数,分别表示木乃伊、人还有出口的位置。

输出

如果能安全逃生则输出Yes,否则输出No,答案占一行。


新鲜出炉的第二版代码(更简洁清晰明了):

#include <iostream>
#include <queue>

using namespace std;

int n;

int maze[6][6][2];  //存储迷宫的墙

struct node
{
    int mx,my;  //木乃伊位置
    int px,py;  //人位置
    bool useful;    //这个节点是否有效
};                  //无效条件:越界、重复、被抓

node start,target;

queue <node> q1;

int used[6][6][6][6];   //判重

int walk[4][2]=     //返回人走一格的新位置坐标
{
    0, -1,  //左
    +1, 0,  //下
    0, +1,  //右
    -1, 0   //上
};

void input();   //输入函数

bool bfs();

node moveto(node cur, int i);   //返回节点cur扩展的下一个节点next

bool isWall(int x, int y, int i);   //判断方格[x,y]方向是否是墙

int main()
{
    input();

    if(bfs())
    {
        cout<<"Yes"<<endl;
    }
    else
    {
        cout<<"No"<<endl;
    }
    return 0;
}

void input()
{
    //第一行
    cin>>n;

    //第二行
    int i,j,x;
    for(int k=0; k<n; k++)
    {
        cin>>i>>j>>x;
        maze[i][j][x]=1;    //1代表是墙
    }

    //最后三行
    cin>>start.mx>>start.my;
    cin>>start.px>>start.py;
    cin>>target.px>>target.py;

    //初始节点标记并入队
    used[start.mx][start.my][start.px][start.px]=1;
    q1.push(start);
}

bool bfs()
{
    node cur,next;
    while(!q1.empty())
    {
        cur=q1.front();
        q1.pop();

        for(int i=0; i<4; i++)  //人要向四个方向试探
        {
            next=moveto(cur, i);    //获取扩展得到的下
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值