迷宮可行路徑數
題目描述
現有一個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;
}