Thuật toán đệ quy tháp Hà Nội



Source tham khảo

AutoIt http://pastebin.com/Zkk6Xsx3
C++http://pastebin.com/90hpgPV6

Giới thiệu

Tháp Hà Nội là một trò chơi toán học du nhập vào Việt Nam lần đầu năm 1883, nó nhanh chóng trở thành một trò chơi logic kinh điển thú vị, ngoài ra, tháp Hà Nội còn có ý nghĩa trong nhiều lĩnh vực khác, điển hình là Toán học và Tin học, tháp Hà Nội là một bài toán đệ quy siêu kinh điển.



Luật chơi tháp Hà Nội khá đơn giản, có ba cột A, B và C cùng n đĩa được đặt trên cột A xếp chồng lên nhau. Nhiệm vụ duy nhất của người chơi là di chuyển toàn bộ số đĩa từ cột A sang cột C, với điều kiện mỗi lần chỉ được di chuyển 1 đĩa ở trên cùng, và khi đặt đĩa vào cột khác phải đảm bảo sao cho đĩa nhỏ luôn nằm trên đĩa lớn hơn (không phân biệt thứ tự).

Mẹo chơi

Chính vì sự phổ biến và tính logic, nó nhanh chóng trở thành một bài toán và những quy luật.
Có một mẹo chơi như sau, xét số n đĩa, nếu n là chỗ chẵn thì liên tục di chuyển lần lượt các đĩa 1 tới đĩa n sang cột bên phải (thuận chiều kim đồng hồ), ngược lại nếu n lẻ thì liên tục di chuyển sang cột bên trái cho đến khi hoàn tất (nghịch chiều kim đồng hồ).

Ví dụ quá trình di chuyển 2 đĩa (n = 2 là chẵn nên di chuyển từng đĩa liên tục sang cột bên phải thuận chiều kim đồng hồ)

Đối với trường hợp chuyển 3 đĩa (n = 3 là lẻ nên di chuyển từng đĩa liên tục sang cột bên trái nghịch chiều kim đồng hồ)

Thuật toán đệ quy

Để giải trên máy tính, người ta đưa nó thành một bài toán đệ quy. Và để có thể hiểu và đệ quy được bài toán này, ta cùng xét một số trường hợp sau, ta gọi n là số đĩa có trong bài toán và a, b, c là ba cột cho trước:
1. Đối với trường hợp n = 1: ta di chuyển thẳng đĩa n từ cột nguồn sang cột đích
2. Đối với trường hợp n = 2: ta di chuyển

- Đĩa 1 từ cột nguồn (a) sang cột trung gian (b)
- Đĩa 2 từ cột nguồn (a) sang cột đích (c)
- Đĩa 1 từ cột trung gian (c) sang cột đích (c)
3. Đối với trường hợp n = 3: ta di chuyển

- Đĩa 1 và 2 từ cột nguồn (a) sang cột trung gian (b)
- Đĩa 3 sang cột đích (c)
- Đĩa 1 và 2 từ cột trung gian (b) sang cột đích (d)
Và ở trường hợp 3, ta xuất hiện một bài toán nhỏ hơn trong bài toán lớn 3 đĩa, đó là di chuyển 2 đĩa từ cột nguồn (a) sang cột trung gian (b).
Hệ quy chiếu lúc này thay đổi. Đối với đĩa 1 và 2 lúc này, cột nguồn là cột (a), cột đích là cột (b) và cột còn lại là cột trung gian. Lúc này ta chỉ việc ứng dụng là trường hợp 2 mà thôi.

Như vậy có thể thấy rõ mối quan hệ của bài toán, trong một bài toán lớn, có 1 bài toán nhỏ hơn và trong bài toán nhỏ hơn, có các bài toán nhỏ hơn nữa. Vì vậy chúng ta sử dụng đệ quy để giải quyết bài toán này như sau:

- Nếu n = 1 thì di chuyển đĩa n từ cột nguồn đến cột đích
- Nếu n > 1 thì:
+ Di chuyển n-1 đĩa từ cột nguồn sang cột trung gian
+ Di chuyển đĩa n từ cột nguồn sang cột đích
+ Di chuyển n-1 đĩa từ cột trung gian sang cột đích

Code

Xin chào, mình là opdo - một đứa mê những dòng code vô tận. Rất cám ơn vì bạn đã ghé thăm blog của mình ^^. Hi vọng được bạn ủng hộ để blog mình phát triển hơn

Share this

Related Posts

Previous
Next Post »

2 nhận xét

nhận xét
lúc 20:33 13 tháng 6, 2016 delete

Tìm mãi không thấy nút +1 đâu ạ :) hay lắm a

Reply
avatar
lúc 14:45 14 tháng 6, 2016 delete

Thế thì bạn share hộ mình cũng đc ạ
Tks bạn ^^

Reply
avatar