C++解决生活中的算法:走迷宫

一、问题

给出一个矩阵(表示迷宫),由n行m列组成,每个元素只能是0或者1,0表示死路,1表示通路,求出一条从左上角走到右下角的可能的路线,并输出其长度。

例如:

已知迷宫图1,可以行走的路线为图2。

图1 图2

二、实现

首先,我们先将框架搭建好。

cpp 复制代码
#include <iostream>
using namespace std;

int n, m;
int maze[105][105];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> maze[i][j];
        }
    }
    printMinLength(n, m, maze);
    return 0;
}

然后,我们拼接出函数。

cpp 复制代码
#include <iostream>
using namespace std;

int n, m;
int maze[105][105];

bool isRoad(int x, int y); // 是不是通路
bool go(int &x, int &y); // 向前试探1步
void printMinLength(int n, int m, int maze[][105]); // 输出最短路径长度

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> maze[i][j];
        }
    }
    printMinLength(n, m, maze);
    return 0;
}

bool isRoad(int x, int y)
{
    // 情况1: 越界
    if (x < 1 || y < 1) return false;
    if (x > n || y > m) return false;

    // 情况2: 在矩阵内死路
    if (maze[x][y] == 0) return false;

    // 情况3: 在矩阵内通路
    return true;
}

bool go(int &x, int &y)
{
    if (isRoad(x + 1, y)) // 向下走是通路
    {
        x++;
        return true;
    }
    else if (isRoad(x, y + 1)) // 向右走是通路
    {
        y++;
        return true;
    }
    else if (isRoad(x - 1, y)) // 向上是通路
    {
        x--; // 回溯到上一步
        return true;
    }
    else if (isRoad(x, y - 1)) // 向左是通路
    {
        y--;
        return true;
    }
    else
    {
        return false; // 四个方向都不通,迷宫无解
    }
}

void printMinLength(int n, int m, int maze[][105])
{
    int x = 1, y = 1;
    while (true)
    {
        cout << x << "," << y << " -> ";
        if (!go(x, y))
        {
            cout << "迷宫无解" << endl;
            break;
        }
        if (x == n && y == m)
        {
            cout << n << "," << m << endl << "抵达终点! ";
            break;
        }
    }
}

最后,我们来运行一下。

python 复制代码
INPUT
5 5
1 1 1 1 1
0 0 0 0 1
0 1 0 0 1
0 1 0 1 1
0 1 0 0 1

CORRECT OUTPUT
1,1 -> 1,2 -> 1,3 -> 1,4 -> 1,5 -> 2,5 -> 3,5 -> 4,5 -> 5,5
抵达终点! 

MY OUTPUT
1,1 -> 1,2 -> 1,3 -> 1,4 -> 1,5 -> 2,5 -> 3,5 -> 4,5 -> 5,5
抵达终点! 

但是无解的时候,就会开始反复横跳......

不过,只要不是无解,这个程序就可以啦!

相关推荐
Wzc890204bai8 小时前
肥胖成因:饮食之外,消耗吸收慢是关键因素
经验分享·笔记·生活
有梦想的小何9 小时前
了解二八定律,提高工作效率、生活质量
生活
fakaifa1 天前
八戒农场小程序V2最新源码
小程序·uni-app·php·生活·开源软件
2401_844137951 天前
JAVA同城生活新引擎外卖跑腿团购到店服务多合一高效系统小程序源码
微信·微信小程序·小程序·生活·微信公众平台·微信开放平台
qfy1142 天前
CRM如何助力科技服务机构突破业务瓶颈?
生活
算力资源比较多3 天前
人工智能(AI)的影响下人类的生活样子
人工智能·生活
tuantuan_tech3 天前
开放式耳机哪个好用?开放式耳机好还是入耳式耳机好?
大数据·学习·生活·旅游·智能硬件
猫的饭桌4 天前
布偶猫应该喂什么猫罐头:交响乐金罐、希喂、尾巴生活测评
经验分享·笔记·安全·生活
我命由我123455 天前
1.使用 VSCode 过程中的英语积累 - File 菜单(每一次重点积累 5 个单词)
ide·经验分享·vscode·学习·编辑器·生活·学习方法
萌宠心语6 天前
智能听诊器:打造宠物个性化健康生活
生活·宠物