Skip to content

Commit ae39a8b

Browse files
committed
Add hanoi tower
1 parent f589e0d commit ae39a8b

File tree

3 files changed

+116
-9
lines changed

3 files changed

+116
-9
lines changed

README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,15 @@ Thuật toán là một đặc tả rõ ràng về cách giải quyết một l
131131
* **Xứ lý hình ảnh**
132132
* `B` [Seam Carving](src/algorithms/image-processing/seam-carving) - thuật toán thay đổi kích thước hình ảnh.
133133
* **Khác**
134-
* `B` [Tower of Hanoi](src/algorithms/uncategorized/hanoi-tower) - bài toán tháp Hà Nội.
135-
* `B` [Square Matrix Rotation](src/algorithms/uncategorized/square-matrix-rotation)
136-
* `B` [Jump Game](src/algorithms/uncategorized/jump-game) - ví dụ về giải thuât quay lùi, tham lam và quy hoạch động.
137-
* `B` [Unique Paths](src/algorithms/uncategorized/unique-paths) - ví dụ về giải thuật quay lùi, quy hoạch động và tam giác Pascal.
138-
* `B` [Rain Terraces](src/algorithms/uncategorized/rain-terraces) -
139-
* `B` [Recursive Staircase](src/algorithms/uncategorized/recursive-staircase) - đếm số cách đi hết cầu thang (4 giải pháp)
140-
* `B` [Best Time To Buy Sell Stocks](src/algorithms/uncategorized/best-time-to-buy-sell-stocks) - ví dụ về chia để trị.
141-
* `A` [N-Queens Problem](src/algorithms/uncategorized/n-queens) - bài toán N quân hậu.
142-
* `A` [Knight's Tour](src/algorithms/uncategorized/knight-tour) - bài toán ngựa đi đường.
134+
* `B` [Tower of Hanoi](src/algorithms/others/hanoi-tower) - bài toán tháp Hà Nội.
135+
* `B` [Square Matrix Rotation](src/algorithms/others/square-matrix-rotation)
136+
* `B` [Jump Game](src/algorithms/others/jump-game) - ví dụ về giải thuât quay lùi, tham lam và quy hoạch động.
137+
* `B` [Unique Paths](src/algorithms/others/unique-paths) - ví dụ về giải thuật quay lùi, quy hoạch động và tam giác Pascal.
138+
* `B` [Rain Terraces](src/algorithms/others/rain-terraces) -
139+
* `B` [Recursive Staircase](src/algorithms/others/recursive-staircase) - đếm số cách đi hết cầu thang (4 giải pháp)
140+
* `B` [Best Time To Buy Sell Stocks](src/algorithms/others/best-time-to-buy-sell-stocks) - ví dụ về chia để trị.
141+
* `A` [N-Queens Problem](src/algorithms/others/n-queens) - bài toán N quân hậu.
142+
* `A` [Knight's Tour](src/algorithms/others/knight-tour) - bài toán ngựa đi đường.
143143

144144
### Algorithms by Paradigm
145145

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Tháp Hà Nội
2+
3+
Tháp Hà Nội (còn gọi là tháp Brahma hay tháp Lucas) là một trò chơi hay câu đố toán học.
4+
Trò chơi này gồm một bộ các đĩa kích thước khác nhau, nằm xuyên trên ba cái cọc, có thể di chuyển từ cọc này sang cọc khác. Trò chơi bắt đầu bằng cách sắp xếp các đĩa theo trật tự kích thước, sao cho trên mỗi cọc đĩa nhỏ nhất luôn nằm trên cùng, tạo ra một dạng hình nón.
5+
6+
Yêu cầu của trò chơi là di chuyển toàn bộ đĩa sang một cọc khác, với các quy tắc sau:
7+
- Mỗi đĩa chỉ được di chuyển một lần.
8+
- Mỗi lần di chuyển bao gồm các bước lấy đĩa khỏi cọc và đặt nó lên cọc khác.
9+
- Không được đặt đĩa lên đĩa nhỏ hơn.
10+
11+
![Hanoi Tower](https://upload.wikimedia.org/wikipedia/commons/8/8d/Iterative_algorithm_solving_a_6_disks_Tower_of_Hanoi.gif)
12+
13+
Ảnh động thuật toán giải với 6 đĩa.
14+
15+
Với `3` đĩa, câu đó có thể giải trong `7` bước. Số nước đi tối thiểu để giải một câu đố Tháp Hà Nội là `2^n - 1`, trong đó `n` là số đĩa.
16+
17+
## Liên kết
18+
19+
- [Wikipedia](https://en.wikipedia.org/wiki/Tower_of_Hanoi)
20+
- [HackerEarth](https://www.hackerearth.com/blog/algorithms/tower-hanoi-recursion-game-algorithm-explained/)
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import Stack from '../../../data-structures/stack/Stack';
2+
3+
/**
4+
* @param {number} numberOfDiscs
5+
* @param {Stack} fromPole
6+
* @param {Stack} withPole
7+
* @param {Stack} toPole
8+
* @param {function(disc: number, fromPole: number[], toPole: number[])} moveCallback
9+
*/
10+
function hanoiTowerRecursive({
11+
numberOfDiscs,
12+
fromPole,
13+
withPole,
14+
toPole,
15+
moveCallback,
16+
}) {
17+
if (numberOfDiscs === 1) {
18+
// Trường hợp chỉ có một đĩa.
19+
moveCallback(fromPole.peek(), fromPole.toArray(), toPole.toArray());
20+
const disc = fromPole.pop();
21+
toPole.push(disc);
22+
} else {
23+
// Trường hợp có nhiều hơn một đĩa thì tiến hành đệ quy.
24+
25+
// Lấy đĩa dưới cùng trên ngăn xếp fromPole.
26+
hanoiTowerRecursive({
27+
numberOfDiscs: numberOfDiscs - 1,
28+
fromPole,
29+
withPole: toPole,
30+
toPole: withPole,
31+
moveCallback,
32+
});
33+
34+
// Di chuyển đĩa đấy sang cọc đích của nó.
35+
hanoiTowerRecursive({
36+
numberOfDiscs: 1,
37+
fromPole,
38+
withPole,
39+
toPole,
40+
moveCallback,
41+
});
42+
43+
// Di chuyển tháp tạm thời từ cọc phụ đến cọc đích của nó.
44+
hanoiTowerRecursive({
45+
numberOfDiscs: numberOfDiscs - 1,
46+
fromPole: withPole,
47+
withPole: fromPole,
48+
toPole,
49+
moveCallback,
50+
});
51+
}
52+
}
53+
54+
/**
55+
* @param {number} numberOfDiscs
56+
* @param {function(disc: number, fromPole: number[], toPole: number[])} moveCallback
57+
* @param {Stack} [fromPole]
58+
* @param {Stack} [withPole]
59+
* @param {Stack} [toPole]
60+
*/
61+
export default function hanoiTower({
62+
numberOfDiscs,
63+
moveCallback,
64+
fromPole = new Stack(),
65+
withPole = new Stack(),
66+
toPole = new Stack(),
67+
}) {
68+
// Each of three poles of Tower of Hanoi puzzle is represented as a stack
69+
// that might contain elements (discs). Each disc is represented as a number.
70+
// Larger discs have bigger number equivalent.
71+
// Mỗi cột trong số ba cọc của câu đố Tháp Hà Nội được biểu diễn như một ngăn xếp.
72+
// có thể chứa các phần tử (đĩa). Mỗi đĩa được biểu diễn dưới dạng một số.
73+
// Đĩa lớn hơn có giá trị lớn hơn.
74+
75+
// Tạo ra các đĩa và đặt chúng vào fromPole.
76+
for (let discSize = numberOfDiscs; discSize > 0; discSize -= 1) {
77+
fromPole.push(discSize);
78+
}
79+
80+
hanoiTowerRecursive({
81+
numberOfDiscs,
82+
fromPole,
83+
withPole,
84+
toPole,
85+
moveCallback,
86+
});
87+
}

0 commit comments

Comments
 (0)