迷宫可行路径数

迷宫可行路径数

题目描述

现有一个n*m大小的迷宫,其中1表示不可通过的墙壁,0表示平地。每次移动只能向上下左右移动一格(不允许移动到曾经经过的位置),且只能移动到平地上。求从迷宫左上角到右下角的所有可行路径的条数。

输入描述

第一行两个整数n​​​、m(2<=n​<=5,2<=m<=5​​),分别表示迷宫的行数和列数;
接下来n行,每行m​个整数(值为0或1),表示迷宫。

输出描述

一个整数,表示可行路径的条数

样例

输入

3 3
0 0 0
0 1 0
0 0 0

输出

2

解题思路

1.求路径的相关问题,一般用DFS/BFS,此题我用DFS,(因为俺觉得DFS相对更好实现一点)
2.怎么用嘞?
首先要有个函数检查边界吧~
还要有个函数记录有没有被标记吧~
然后就是最重要的DFS去遍历递归吧~
咦,好像就这样想着想着就出来整体逻辑啦,哈哈O(∩_∩)O
3.DFS的参数是什么呢?
这是我一直头疼的地方,主要还是看之前做过什么工作啦——也就是之前的函数实现了什么功能
不妨先写上几个必须的,然后开始写函数,如果还需要其他参数就加上好咯

题解

#include <iostream>
using namespace std;

const int MAXN = 5;
int n, m, maze[MAXN][MAXN];
bool visited[MAXN][MAXN] = {false};//记录是否被标记访问过
int counter = 0;//记录路径数量

const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};

bool isValid(int x, int y) {
    return x >= 0 && x < n && y >= 0 && y < m && maze[x][y] == 0 && !visited[x][y];
}

void DFS(int x, int y) {
    if (x == n - 1 && y == m - 1) {
        counter++;
        return;
    }
    visited[x][y] = true;
    for (int i = 0; i < MAXD; i++) {
        int nextX = x + dx[i];
        int nextY = y + dy[i];
        if (isValid(nextX, nextY)) {
            DFS(nextX, nextY);
        }
    }
    visited[x][y] = false;
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d", &maze[i][j]);
        }
    }
    DFS(0, 0);
    printf("%d", counter);
    return 0;
}
posted @ 2024-11-29 09:40  Chunleiii  阅读(15)  评论(0编辑  收藏  举报