Cách giải Bài toán:
Bài toán có 2 chiều, chiều nghịch dùng để phân tích bài toán và dùng để lập trình, chiều thuận để thực hiện trên mô hình. Ở đây nguyên lí thực hiện (tức là cách hiểu bài toán) nằm ở chiều nghịch, còn cách thực hiện nằm ở chiều thuận. Chiều nghịch dùng cho dân lập trình và chiều thuận dành cho dân toán.
Chiều nghịch thì dân lập trình hay gọi là bài toán đệ qui. Bài toán này có ví dụ đơn giản như sau: giaithừa(n)=giaithừa(n-1)*n. Muốn tính giai thừa của n thì đơn giản, lấy n nhân với giai thừa của (n-1). Còn giai thừa của (n-1) thì tính sao? Đơn giản, cứ lấy (n-1) nhân với giai thừa của (n-2) …
- Chiều nghịch (nguyên lí): Muốn đưa n khối tròn từ cột A (cột nguồn) sang cột C (cột đích) thông qua cột B (cột trung gian) thì chỉ cần đưa (n-1) khối tròn từ A qua B, rồi đưa 1 khối tròn từ A qua C và cuối cùng là đưa (n-1) khối tròn từ B qua C. Đã làm xong bài toán!!!
Còn (n-1) khối tròn từ A sang B thì làm sao mà đưa? Đơn giản, khi đó xem A là cột nguồn, B là cột đích và C là cột trung gian. Việc tiến hành tương tự, đưa (n-2) khối từ cột nguồn qua cột trung gian, 1 khối từ cột nguồn sang cột đích và cuối cùng là (n-2) khối từ cột trung gian sang cột đích. Còn về source code thì sao, xin xem phần sau cùng vì nếu viết ở đây sẽ có thể gây rối một vài bạn đọc không được học về lập trình.
- Chiều thuận: Nói đơn giản để hiệu thì như chiều nghịch đã nói. Còn thực hiện (chiều thuận) thì làm sao? Khối tròn đầu tiên từ cột nguồn A thì chuyển vào đâu? Cột trung gian B hay cột đích C?
Với khối tròn đầu tiên thì chuyển về cột đích (với n là số lẻ) và cột trung gian (với n là số chẳn). Xếp được 1 khối tròn (khối nhỏ nhất) theo đúng yêu cầu thì tiếp theo là xếp 2 khối tròn theo đúng yêu cầu (2 khối nhỏ nhất và nhỏ nhì). Cứ xếp 2 khối đó vào cột còn lại so với lần đầu tiên và làm tiếp vớ 3, 4, … khối tròn. Điều vừa nói được diễn đạt như sau:
Với n lẻ: cách xếp các khối như sau. Đầu tiên là xếp được 1 khối nhỏ nhất (bài toán với n=1). Sau đó xếp 2 khối nhỏ nhất (bài toán với n=2) ….
• 1 khối nhỏ nhất qua C (cột đích)
• 2 khối nhỏ nhất qua B (cột trung gian)
• 3 khối nhỏ nhất qua C (cột đích)
• 4 khối nhỏ nhất qua B (cột trung gian)
• Tiếp tục như trên
Với n chẳn: cách xếp các khối như sau. Đầu tiên là xếp được 1 khối nhỏ nhất (bài toán với n=1). Sau đó xếp 2 khối nhỏ nhất (bài toán với n=2) ….
• 1 khối nhỏ nhất qua B (cột trung gian)
• 2 khối nhỏ nhất qua C (cột đích)
• 3 khối nhỏ nhất qua B (cột trung gian)
• 4 khối nhỏ nhất qua C (cột đích)
• Tiếp tục như trên
Phát triển của cách làm trên: Muốn chuyển n khối tròn từ cột nguồn sang cột đích thì làm như sau (ở đây ta phải hiểu rõ cột nguồn không nhất thiết là cột A, cột đích là C hay cột trung gian là B mà phải hiểu tổng quát, có thể cột nguồn là B chẳng hạn (trong phép chuyển (n-1) cột từ cột B sang cột C như trong cách làm ở phần nghịch)):
Với n lẻ: cách xếp các khối như sau. Đầu tiên là xếp được 1 khối nhỏ nhất (bài toán với n=1). Sau đó xếp 2 khối nhỏ nhất (bài toán với n=2) ….
• 1 khối nhỏ nhất qua cột đích
• 2 khối nhỏ nhất qua cột trung gian
• 3 khối nhỏ nhất qua cột đích
• 4 khối nhỏ nhất qua cột trung gian
• Tiếp tục như trên
Với n chẳn: cách xếp các khối như sau. Đầu tiên là xếp được 1 khối nhỏ nhất (bài toán với n=1). Sau đó xếp 2 khối nhỏ nhất (bài toán với n=2) ….
• 1 khối nhỏ nhất qua cột trung gian
• 2 khối nhỏ nhất qua cột đích
• 3 khối nhỏ nhất qua cột trung gian
• 4 khối nhỏ nhất qua cột đích
• Tiếp tục như trên
- Như vậy thì số lần chuyển cho bài toán là bao nhiêu? Với bài toán tháp Hà Nội chuyển n khối tròn từ cột nguồn A sang cột đích C thông qua cột trung gian B thì cần có 2^0 + 2^1 + 2^2 + … + 2^n lần chuyển
Sưu tầm.
Đây là hình ảnh của cách chuyển với 3 và 4 đĩa. DR đã lấy nó trên internet, rồi đem chỉnh sửa, tăng thêm các điểm dừng để các bạn dễ hình dung cách giải hơn. OK
Với 4 đĩa:
Với 3 đĩa: