说明
假说我们有一个大小为n*n的矩阵,矩阵的每一个位置是一个方块。每个位置可以是空闲的(值为1)或是被阻挡的(值为0),如下图所示,其中s是起点,d是终点
矩阵是迷宫,‘老鼠’的目标是从位置
[0][0]开始并移动到[n-1][n-1](终点),‘老鼠’可以在水平或垂直方向上任何未被阻挡的位置间移动
例子
使用下面代码进行测试
const maze = [
[1,0,0,0],
[1,1,1,1],
[1,0,1,0],
[1,0,1,1],
]
思路
- 首先创建一个大小一样的矩阵,将每一个位置初始化为
0 - 对于老鼠的每一步行动我们将路劲标记为
1 - 使用递归来判断
x+1,或者y+1的节点是否满足条件,不满足条件则从新把路劲标为0
代码
function ratInAAmaze(maze) {
// 初始化矩阵每一项为0
let r = [];
for (let i = 0; i < maze.length; i++) {
r[i] = [];
for (let j = 0; j < maze[i].length; j++) {
r[i][j] = 0;
}
}
// 递归寻找下一个路径坐标点,如果找到正确到达[n-1][n-1]的路径则使用结果r
if (findPath(maze, 0, 0, r)) {
return r;
}
return "NO PATH";
}
function findPath(maze, x, y, r) {
const n = maze.length;
// 如果寻找到最后一个位置,即[n-1][n-1],则找到正确路径,返回true
if (x === n - 1 && y === n - 1) {
r[x][y] = 1;
return true
}
// 判断当前坐标点是否可用
if (isSafe(maze, x, y)) {
// 可用则设置坐标点的值为1
r[x][y] = 1;
// 递归寻找下一个路径坐标点(x+1)
if (findPath(maze, x + 1, y, r)) {
return true;
}
// 递归寻找下一个路径坐标点(y+1)
if (findPath(maze, x, y + 1, r)) {
return true;
}
// 如果下一个路径坐标点不可用,则当前坐标点也不可用
r[x][y] = 0;
return false;
}
return false;
}
function isSafe(maze, x, y) {
const n = maze.length;
if (x < n && y < n && maze[x][y] !== 0) {
return true;
}
return false;
}
const maze = [
[1,0,0,0],
[1,1,1,1],
[0,0,1,0],
[1,1,1,0],
]
console.log(ratInAAmaze(maze))