一、 问题描述
迷宫是许多小方格构成的矩形,在每个小方格中有的是墙(图中的“1”),有的是路(图中的“0”)。走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。设迷宫的入口是在左上角(1,1),出口是右下角(8,8)。根据给定的迷宫,找出从入口到出口的所有方案数。
二、算法思想
解决这个问题的经典算法是使用回溯法。具体步骤如下:
- 定义一个二维数组maze表示迷宫,其中1表示墙,0表示路。
- 定义一个二维数组visited表示访问过的方格,初始值都为false。
- 定义一个变量count表示方案数,初始值为0。
- 定义一个递归函数solve(x, y),其中x和y表示当前位置的坐标。
- 在递归函数中,首先判断当前位置是否为终点(8,8),如果是,则将方案数count加1,然后返回。
- 否则,首先将当前位置标记为已访问。
- 然后依次判断当前位置上、下、左、右四个方向的相邻方格是否为路且未访问过,如果是,则递归调用solve函数继续搜索。
- 最后将当前位置标记为未访问,表示回溯。
- 在主函数中调用solve(1, 1)开始搜索迷宫。
- 最后输出方案数count。
三、代码实现
#include <stdio.h>
#include <stdbool.h>
#define ROW 8
#define COL 8
int maze[ROW][COL] = {
{ 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 1, 1, 1, 1, 1, 1, 1 },
{ 0, 0, 0, 1, 0, 0, 0, 1 },
{ 0, 1, 0, 1, 0, 1, 0, 1 },
{ 0, 1, 0, 0, 0, 1, 0, 1 },
{ 0, 0, 0, 1, 1, 1, 0, 1 },
{ 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0, 0 }
};
bool visited[ROW][COL] = {false};
int dfs(int startX, int startY) {
if (startX == ROW - 1 && startY == COL - 1) {
return 1;
}
int count = 0;
visited[startX][startY] = true;
if (startY + 1 < COL && maze[startX][startY + 1] == 0 && !visited[startX][startY + 1]) {
count += dfs(startX, startY + 1);
}
if (startX + 1 < ROW && maze[startX + 1][startY] == 0 && !visited[startX + 1][startY]) {
count += dfs(startX + 1, startY);
}
if (startY - 1 >= 0 && maze[startX][startY - 1] == 0 && !visited[startX][startY - 1]) {
count += dfs(startX, startY - 1);
}
if (startX - 1 >= 0 && maze[startX - 1][startY] == 0 && !visited[startX - 1][startY]) {
count += dfs(startX - 1, startY);
}
visited[startX][startY] = false;
return count;
}
int main() {
int totalPaths = dfs(0, 0);
printf("%d", totalPaths);
return 0;
}
执行结果
结语
没有哪条路是一帆风顺的
但坚持走下去就会看到曙光
!!!