[JS][dfs]题解 | #迷宫问题#
生活随笔
收集整理的這篇文章主要介紹了
[JS][dfs]题解 | #迷宫问题#
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題解 | #迷宮問題#
題目鏈接
迷宮問題
題目描述
定義一個二維數組 N*M ,如 5 × 5 數組下所示:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一個迷宮,其中的1表示墻壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求編程序找出從左上角到右下角的路線。入口點為[0,0],既第一格是可以走的路。
本題含有多組數據。
輸入描述:
輸入兩個整數,分別表示二維數組的行數,列數。再輸入相應的數組,其中的1表示墻壁,0表示可以走的路。數據保證有唯一解,不考慮有多解的情況,即迷宮只有一條通道。
輸出描述:
左上角到右下角的最短路徑,格式如樣例所示。
示例1
輸入:
5 5
0 1 0 0 0
0 1 1 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
輸出:
(0,0)
(1,0)
(2,0)
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)
示例2
輸入:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 1
0 1 1 1 0
0 0 0 0 0
輸出:
(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(4,1)
(4,2)
(4,3)
(4,4)
解題思路
簡單尋路,注意多組輸入即可。使用的方法是dfs,在每一次到達終點時判斷是否為更短路并刷新,就OK。
題解
while (line = readline()) {let nums = line.split(' ');let col = +nums[0];let row = +nums[1];let map = [];for (let i = 0; i < col; i++) {map.push([]);let mapline = readline().split(' ');for (let j = 0; j < row; j++) {map[i][j] = +mapline[j];}}let minLine = [];let nowLine = [];let dir = [[0, 1], [0, -1], [1, 0], [-1, 0]];let book = [];for (let i = 0; i < col; i++) {book.push([]);for (let j = 0; j < row; j++) {book[i][j] = 0;}}let dfs = (x, y) => {nowLine.push(`(${x},${y})`);book[x][y] = 1;if (x == col - 1 && y == row - 1) {if (minLine.length == 0 || nowLine.length < minLine.length) {minLine = [];for (let i = 0; i < nowLine.length; i++) {minLine[i] = nowLine[i];}}book[x][y] = 0;nowLine.pop();return;}for (let i = 0; i < 4; i++) {let tox = x + dir[i][0];let toy = y + dir[i][1];if (tox >= 0 && tox < col && toy >= 0 && toy < row && map[tox][toy] == 0 && book[tox][toy] == 0) {dfs(tox, toy);}}book[x][y] = 0;nowLine.pop();return;}dfs(0, 0);for (let i = 0; i < minLine.length; i++) {console.log(minLine[i]);}
}
總結
以上是生活随笔為你收集整理的[JS][dfs]题解 | #迷宫问题#的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇:  SEAS小颜做脸多久做一次比
- 下一篇: OPPO小游戏vConsole开启方法