C++ 算法题解:迷宫寻路

题干

输入

第一行是两个数字h和w,分别是迷宫的高和宽。

接下来是h行,每行w个数字,其中0表示可以通行,1表示不可以通行。

接下来的一行是beginx和beginy两个数字,表示从哪里开始走迷宫。

再接下来的一行是endx和endy,表示终点在哪里。

例如:

6 6

1 1 1 1 1 1

1 0 0 0 0 0

1 1 1 1 1 1

0 0 1 0 1 1

0 0 1 0 0 0

0 0 0 1 1 1

1 1

5 1

表示这是一个6x6的迷宫,接下来的6行给出迷宫的形状。

接下来的1 1表示起点是( 1, 1 )

再接下来的一行5 2表示终点是( 5, 2 )

这个例子里显然是存在路径的。

输出

如果起点可以到达终点,输出yes,否则输出no。

上例中输出yes。

输入样例 1

6 6

1 1 1 1 1 1

1 0 0 0 0 0

1 1 1 1 1 1

0 0 1 0 1 1

0 0 1 0 0 0

0 0 0 1 1 1

1 1

5 1

输出样例 1

yes

输入样例 2

6 6

1 1 1 1 1 1

1 0 1 0 0 0

1 1 1 1 1 1

1 0 1 0 1 1

1 0 1 0 0 0

1 0 1 1 1 1

1 1

1 5

输出样例 2

no

题解

cpp 复制代码
#include <stdio.h>
// 定义迷宫最大尺寸
#define MAX 100
// 迷宫高,宽
int h, w;
// 迷宫定义
int maze[MAX][MAX];
// 根据题目推测可能输入矩阵左上为原点,宽为x坐标,高为y坐标
// 一步可以移动的路径上,下,左,右
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
// 判断点位是否为迷宫内未访问过的路径点
bool valid(int x, int y) {
    printf("check valid(%d, %d): maze = %d\n", x, y, maze[y][x]);
    return x >= 0 && x < h && y >= 0 && y < w && maze[y][x] == 0;
}
// 以深度优先搜索算法判断起点和终点是否联通
bool dfs(int x, int y, int ex, int ey) {    
    // 打印调试信息:当前位置和目标位置
    printf("curr:(%d, %d), end:(%d, %d)\n",x ,y ,ex ,ey);
    // 如果起点和终点重合,既抵达终点,则返回true
    if (x == ex && y == ey) {
        return true;
    }
    // 标识访问过的路径点
    maze[y][x] = -1;
    // 遍历每一个相邻路径点
    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        // 判断是否为迷宫内未访问过的路径点
        if (valid(nx, ny)) {            
            // 打印调试信息:地图
            for (int i = 0; i < h; i++) {
                for (int j = 0; j < w; j++) {
                    if(i == y && j == x){
                        // 打印当前位置
                        printf("* ");
                    } else if(i == ny && j == nx){
                        // 打印下一个路径点
                        printf("@ ");
                    } else if(maze[i][j] == -1){
                        // 打印已经访问过的路径点
                        printf("x ");
                    } else {
                        // 打印迷宫
                        printf("%d ",maze[i][j]);
                    }
                }
                printf("\n");
            }
            // 以下一个新路径点为起点判断是否与终点联通
            if (dfs(nx, ny, ex, ey)) {
                // 如果联通则返回true
                return true;
            }
        }
    }
    // 如果每一个相邻路径点都不连通则返回false
    return false;
}

int main() {
    // 读入高,宽
    scanf("%d %d", &h, &w);
    // 读入行
    for (int i = 0; i < h; i++) {
        // 读入列
        for (int j = 0; j < w; j++) {
            scanf("%d ", &maze[i][j]);
        }
    }
    
    int beginx, beginy, endx, endy;
    // 读入起点
    scanf("%d %d", &beginx, &beginy);
    // 读入终点
    scanf("%d %d", &endx, &endy);

    // 检查起点终点是否可通行
    if (maze[beginx][beginy] == 1 || maze[endx][endy] == 1) {
        printf("no\n");
        return 0;
    }

    if (dfs(beginx, beginy, endx, endy)) {
        printf("yes\n");
    } else {
        printf("no\n");
    }

    return 0;
}
相关推荐
玖釉-11 分钟前
[Vulkan 学习之路] 08 - 给图片穿马甲:图像视图 (Image Views)
c++·windows·图形渲染
m0_7482500342 分钟前
C++ 信号处理
c++·算法·信号处理
Ro Jace43 分钟前
电子侦察信号处理流程及常用算法
算法·信号处理
yuyanjingtao1 小时前
动态规划 背包 之 凑钱
c++·算法·青少年编程·动态规划·gesp·csp-j/s
core5122 小时前
SGD 算法详解:蒙眼下山的寻宝者
人工智能·算法·矩阵分解·sgd·目标函数
Ka1Yan2 小时前
[链表] - 代码随想录 707. 设计链表
数据结构·算法·链表
scx201310042 小时前
20260112树状数组总结
数据结构·c++·算法·树状数组
FastMoMO2 小时前
Qwen3-VL-2B 在 RK3576 上的部署实践:RKNN + RKLLM 全流程
算法
光算科技2 小时前
AI重写工具导致‘文本湍流’特征|如何人工消除算法识别标记
大数据·人工智能·算法
星竹晨L2 小时前
【C++内存安全管理】智能指针的使用和原理
开发语言·c++