2018-10-10 18:03:03 -04:00
|
|
|
|
---
|
|
|
|
|
id: 5951ed8945deab770972ae56
|
2020-12-16 00:37:30 -07:00
|
|
|
|
title: 河内的塔
|
2018-10-10 18:03:03 -04:00
|
|
|
|
challengeType: 5
|
|
|
|
|
videoUrl: ''
|
2021-01-13 03:31:00 +01:00
|
|
|
|
dashedName: towers-of-hanoi
|
2018-10-10 18:03:03 -04:00
|
|
|
|
---
|
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
# --description--
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
任务:
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
解决[河内塔](https://en.wikipedia.org/wiki/Towers_of_Hanoi "wp:Towers_of_Hanoi")问题。
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
您的解决方案应该接受光盘数量作为第一个参数,并使用三个字符串来识别三个光盘堆栈中的每一个,例如`towerOfHanoi(4, 'A', 'B', 'C')` 。该函数应该返回一个包含移动列表的数组数组,source - > destination。例如,数组`[['A', 'C'], ['B', 'A']]`表示第一个移动是将光盘从堆栈A移动到C,第二个移动是移动一个从堆栈B到A的光盘
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
# --hints--
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
`towerOfHanoi`是一个功能。
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
```js
|
|
|
|
|
assert(typeof towerOfHanoi === 'function');
|
2018-10-10 18:03:03 -04:00
|
|
|
|
```
|
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
`towerOfHanoi(3, ...)` 应该返回7招。
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
```js
|
|
|
|
|
assert(res3.length === 7);
|
|
|
|
|
```
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
`towerOfHanoi(3, "A", "B", "C")`应返回\[[“A”,“B”],[“A”,“C”],[“B”,“C”],[ “A”, “B”],[ “C”, “A”],[ “C”, “B”],[ “A”, “B”]]“)。
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
|
|
|
|
```js
|
2020-12-16 00:37:30 -07:00
|
|
|
|
assert.deepEqual(towerOfHanoi(3, 'A', 'B', 'C'), res3Moves);
|
2018-10-10 18:03:03 -04:00
|
|
|
|
```
|
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
`towerOfHanoi(5, "X", "Y", "Z")`第10 `towerOfHanoi(5, "X", "Y", "Z")`应为Y - > X.
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
```js
|
|
|
|
|
assert.deepEqual(res5[9], ['Y', 'X']);
|
|
|
|
|
```
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
`towerOfHanoi(7, "A", "B", "C")`前十个动作是\[[“A”,“B”],[“A”,“C”],[“B”,“C”][ “A”, “B”],[ “C”, “A”],[ “C”, “B”],[ “A”, “B”],[ “A”, “C”][ “B”, “C”],[ “B”, “A”]]“)。
|
2018-10-10 18:03:03 -04:00
|
|
|
|
|
|
|
|
|
```js
|
2020-12-16 00:37:30 -07:00
|
|
|
|
assert.deepEqual(towerOfHanoi(7, 'A', 'B', 'C').slice(0, 10), res7First10Moves);
|
2018-10-10 18:03:03 -04:00
|
|
|
|
```
|
2020-08-13 17:24:35 +02:00
|
|
|
|
|
2021-01-13 03:31:00 +01:00
|
|
|
|
# --seed--
|
|
|
|
|
|
|
|
|
|
## --after-user-code--
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const res3 = towerOfHanoi(3, 'A', 'B', 'C');
|
|
|
|
|
const res3Moves = [['A', 'B'], ['A', 'C'], ['B', 'C'], ['A', 'B'], ['C', 'A'], ['C', 'B'], ['A', 'B']];
|
|
|
|
|
const res5 = towerOfHanoi(5, 'X', 'Y', 'Z');
|
|
|
|
|
const res7First10Moves = [['A', 'B'], ['A', 'C'], ['B', 'C'], ['A', 'B'], ['C', 'A'], ['C', 'B'], ['A', 'B'], ['A', 'C'], ['B', 'C'], ['B', 'A']];
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## --seed-contents--
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
function towerOfHanoi(n, a, b, c) {
|
|
|
|
|
|
|
|
|
|
return [[]];
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2020-12-16 00:37:30 -07:00
|
|
|
|
# --solutions--
|
|
|
|
|
|
2021-01-13 03:31:00 +01:00
|
|
|
|
```js
|
|
|
|
|
function towerOfHanoi(n, a, b, c) {
|
|
|
|
|
const res = [];
|
|
|
|
|
towerOfHanoiHelper(n, a, c, b, res);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function towerOfHanoiHelper(n, a, b, c, res) {
|
|
|
|
|
if (n > 0) {
|
|
|
|
|
towerOfHanoiHelper(n - 1, a, c, b, res);
|
|
|
|
|
res.push([a, c]);
|
|
|
|
|
towerOfHanoiHelper(n - 1, b, a, c, res);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|