机器人走迷宫
题目
-
房间有
X*Y
的方格组成,例如下图为6*4
的大小。每一个放个以坐标(x,y)
描述。 -
机器人固定从方格
(0,0)
出发,只能向东或者向北前进,
出口固定为房间的最东北角,如下图的方格(5,3)
。
用例保证机器人可以从入口走到出口。 -
房间有些方格是墙壁,如
(4,1)
,机器人不能经过那儿。 -
有些地方是一旦到达就无法走到出口的,如标记为
B
的方格,称之为陷阱方格。 -
有些地方是机器人无法达到的,如标记为
A
的方格,称之为不可达方格,不可达方格不包括墙壁所在的位置 -
如下实例图中,陷阱方格有
2
个,不可达方格有3
个。 -
请为该机器人实现路径规划功能:给定房间大小,墙壁位置,请计算出陷阱方格与不可达方格分别有多少个
输入
- 第一行为房间的
x
和y
(0 < x,y <= 1000
) - 第二行为房间中墙壁的个数
N
(0 <= N < X*Y
) - 接着下面会有
N
行墙壁的坐标
同一行中如果有多个数据以一个空格隔开,用例保证所有的输入数据均合法,(结尾不带回车换行)
输出
- 陷阱方格与不可达方格数量,两个信息在一行中输出,以一个空格隔开。(结尾不带回车换行)
示例一
输入
6 4
5
0 2
1 2
2 2
4 1
5 1
输出
2 3
示例二
输入
6 4
4
2 0
2 1
3 0
3 1
输出
0 4
说明
说明不可达方格有4
个 (4,0)
(4,1)
(5,0)
(5,1)
解题思路
核心算法是深度优先搜索,解决了一道题目,判断一个地图中是否有陷阱。代码中有一些细节,需要注意。
读取输入
在JavaScript中,我们可以使用readline模块。为了避免一次性读取所有输入,我们可以通过监听stdin的line事件,每读取一行执行一次。
定义Check类
由于JavaScript中没有类的概念,我们可以使用一个对象字面量来代替这个类。我们需要实现equals和hashCode方法,以便在Set中使用。equals方法检查两个对象是否相等,hashCode方法为对象计算
Code
const readline = require("readline");
class Check {
constructor(x, y) {
this.x = x;
this.y = y;
}
equals(other) {
return this.x === other.x && this.y === other.y;
}
hashCode() {
return this.x * 31 + this.y;
}
}
let xLen;
let yLen;
function main() {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
const input = line.trim().split(" ").map(Number);
if (xLen === undefined) {
xLen = input[0];
yLen = input[1];
const n = input[2];
const walls = [];
for (let i = 0; i < n; i++) {
walls.push([parseInt(rl.read()), parseInt(rl.read())]);
}
solveMethod(walls);
}
});
}
function solveMethod(walls) {
let trapCount = 0;
let invalidCount = 0;
const wallSet = new Set();
for (const wall of walls) {
wallSet.add(new Check(wall[0], wall[1]));
}
const checks = new Set();
const finish = new Set();
findOut(0, 0, wallSet, checks, finish);
invalidCount = xLen * yLen - checks.size - wallSet.size;
for (const check of finish) {
const checksT = new Set();
const finishT = new Set();
findOut(check.x, check.y, wallSet, checksT, finishT);
if (!finishT.has(new Check(xLen - 1, yLen - 1))) {
trapCount++;
}
}
console.log(trapCount + " " + invalidCount);
}
function findOut(x, y, wallSet, checks, finish) {
if (x === xLen - 1 && y === yLen - 1) {
finish.add(new Check(x, y));
}
if (x >= xLen || y >= yLen) {
return;
}
checks.add(new Check(x, y));
if (!wallSet.has(new Check(x, y + 1))) {
findOut(x, y + 1, wallSet, checks, finish);
} else {
finish.add(new Check(x, y));
}
if (!wallSet.has(new Check(x + 1, y))) {
findOut(x + 1, y, wallSet, checks, finish);
} else {
finish.add(new Check(x, y));
}
}
版权说明
试题来源:华为 OD 联盟整理收集
题解:解题思路 与 代码 为原创内容,该部分版权由 OD 联盟共同拥有,并授权组内成员发布。
目标:👉 助你解开所有机试题