迷宫可行路径数
迷宫可行路径数
题目描述
现有一个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;
}