迷宮可行路徑數

Chunleiii發表於2024-11-29

迷宮可行路徑數

題目描述

現有一個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;
}

相關文章