Bài toán tháp Hà Nội: Sử dụng đệ quy để giải

Trong bài này mình sẽ thực hiện giải một bài toán rất kinh điển đó chính là bài toán tháp Hà Nội.

test php

banquyen png

Bài viết này được đăng tại

freetuts.net

, không được copy dưới mọi hình thức.

Đây là một bài toán vận dụng đệ quy để giải, có lẽ rằng những bạn cũng đã từng nghe qua bài toán này rồi. Và tất cả chúng ta sẽ lần lượt khám phá về bài toán tháp Hà Nội là gì ? Sau đó mình sẽ đưa ra giải thuật để giải .

Bài toán tháp Hà Nội là gì?

Bài toán tháp Hà Nội là một game show toán học rất phổ cập. Nó đơn thuần chỉ là việc di dời những đĩa từ cột này sang cột khác. Nhưng để thành thạo luật chơi của nó thì rất khó .

Luật chơi được mô tả như sau:

Trò chơi này gồm một bộ những đĩa size khác nhau, có lỗ ở giữa, nằm xuyên trên ba cái cột. Bài toán đố khởi đầu bằng cách sắp xếp những đĩa theo trật tự size vào một cột, sao cho đĩa nhỏ nhất nằm ở trên cùng, tức là tạo thành một hình nón .
Yêu cầu của game show là vận động và di chuyển hàng loạt số đĩa sang một cột khác, tuân theo những quy tắc sau :

  • Một lần chỉ có 3 cột để di chuyển
  • Chỉ di chuyển một đĩa trên cùng (không được di chuyển đĩa nằm giữa hay nằm cuối).
  • Một đĩa chỉ có thể đặt lên một đĩa lớn hơn (không nhất thiết hai đĩa này phải có kích thước liền kề, tức là đĩa nhỏ nhất vẫn có thể đặt trên đĩa lớn nhất).

photo 1 1488855314632 png

Ý tưởng đệ quy

Dựa vào luật chơi của game show, tất cả chúng ta sẽ vận dụng nó vào đệ quy để giải bài toán này bằng ngôn từ C + + nhé .
Trong bài toán này tất cả chúng ta cần chăm sóc 4 yếu tố : số đĩa N, cột A, cột B, cột C .

Nhiệm vụ của chúng ta là chuyển N số đĩa từ cột A sang cột C, lấy cột B làm cột tạm.

Ý tưởng:

  • Nếu đã biết cách chuyển N – 1 đĩa từ cột A sang cột B, ta chỉ cần chuyển đĩa thứ N (đĩa cuối cùng) từ cột A sang cột C, rồi chuyển N – 1 đĩa từ cột B sang cột C.
  • Giải thuật không còn đệ quy khi chỉ có 1 đĩa, vì ta chuyển trực tiếp từ cột A sang cột C luôn mà không cần thông qua cột B.
  • Độ phức tạp của nó là: 2n - 1 (lần dịch chuyển).

tro choi thap ha noi PNG

Giải bài toán tháp Hà Nội bằng C++

Chúng ta đã có ý tưởng sáng tạo giải bài toán, chỉ cần dựa vào đó và vận dụng thêm kiến thức và kỹ năng về đệ quy để bắt tay vào việc giải thôi nào .

Giải thuật

void move(int n,char A,char B,char C)
 {
      if(n==1){
        cout< "< C
      }
      else {		
        // Nếu n > 1 thì thực hiện lần lượt các bước
        move(n - 1, A, C, B); // 1. Dịch chuyển n-1 đĩa từ A -> B
        cout< "< C
        move(n - 1, B, A, C); // 3. Dịch chuyển n-1 đĩa từ B -> C
      }
 }

Như những bạn thấy tất cả chúng ta cần truyền 4 tham số cho hàm move ( ) là : số đĩa n, cột A, cột B, cột C .
Nếu như n = = 1 ( chỉ có một đĩa ) thì tất cả chúng ta chỉ cần chuyển đĩa đó từ cột A sang cột C là xong .
Trường hợp số đĩa n lớn hơn 1 thì tất cả chúng ta cần thực thi di dời ba lần :

  1. Chuyển n – 1 đĩa từ cột A sang cột B -> move(n - 1, A, C, B);
  2. Chuyển đĩa còn lại (đĩa thứ n) từ cột A sang cột C -> cout< "<
  3. Chuyển n – 1 đĩa từ cột B sang cột C -> move(n - 1, B, A, C);

Giả sử chúng ta có n = 3 thì số lần thực hiện dịch chuyển bằng 2n - 1 = 23 - 1 = 7 (lần).

thap ha noi PNG

Hàm main()

#include 
using namespace std;

void move(int n,char A,char B,char C)
 {
      if(n==1){
        cout< "< C
      }
      else {		
        //// Nếu n > 1 thì thực hiện lần lượt các bước
        move(n - 1, A, C, B); // 1. Dịch chuyển n-1 đĩa từ A -> B
        cout< "< C
        move(n - 1, B, A, C); // 3. Dịch chuyển n-1 đĩa từ B -> C
      }
 }

int main() {
  int n;
  cout<>n;
  cout<<"Thứ tự dịch chuyển các vị trí A B C là: \n";
  move(n, 'A', 'B', 'C');
  
  cout<<"\n------------------------------\n";
  cout<<"Chương trình này được đăng tại Freetuts.net";
}

Kết quả:

thap ha noi 1 PNG

Như vậy là tất cả chúng ta đã triển khai xong chương trình tìm cách giải của game show tháp Hà Nội. Chúc những bạn thực thi thành công xuất sắc ! ! !