Trang 1 trên tổng số 5 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 44 kết quả

Đề tài: Bài toán Tháp Hà Nội | Tower of Hanoi

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Mặc định Bài toán Tháp Hà Nội | Tower of Hanoi

    BÀI TOÁN THÁP HÀ NỘI - TOWER OF HANOI

    Có thể còn ít người Việt Nam biết Tháp Hà Nội, nhưng rất nhiều thanh niên sinh viên trên toàn thế giới lại biết đến nó. Đó là vì, Tháp Hà Nội là tên một bài toán rất nổi tiếng trong Chương trình khoa học tính toán (Computing Science) dành cho sinh viên những năm đầu tại các trường đại học ở nhiều nơi trên thế giới.

    Tương truyền rằng ngày xửa ngày xưa, lâu lắm rồi, ở một vùng xa xôi viễn đông, thành phố Hà Nội của Việt Nam, vị quân sư của Hoàng đế vừa qua đời, Hoàng đế cần một vị quân sư mới thay thế. Bản thân Hoàng đế cũng là một nhà thông thái, nên ngài đặt ra một bài toán đố, tuyên bố ai giải được sẽ được phong làm quân sư. Bài toán của Hoàng đế là: cho n cái đĩa (ngài không nói chính xác là bao nhiêu) và ba cái trục: A là trục nguồn, B là trục đích, và C là trục trung chuyển. Những cái đĩa có kích cỡ khác nhau và có lỗ ở giữa để có thể lồng vào trục, theo quy định "nhỏ trên lớn dưới". Đầu tiên, những cái đĩa này được xếp tại trục A. Vậy làm thế nào để chuyển toàn bộ các đĩa sang trục B, với điều kiện chuyển từng cái một và luôn phải đảm bảo quy định "nhỏ trên lớn dưới", biết rằng trục C được phép sử dụng làm trục trung chuyển?

    Vì địa vị quân sư được coi là vinh hiển nên có rất nhiều người dự thi. Từ vị học giả đến bác nông phu, họ đua nhau trình lên Hoàng đế lời giải của mình. Nhiều lời giải dài tới hàng nghìn bước, và nhiều lời giải có chữ "chuyển sang bước tiếp theo" (go to). Nhưng hoàng đế thấy mệt mỏi vì những lời giải đó, nên cuối cùng hạ chiếu: "Ta không hiểu những lời giải này. Phải có một cách giải nào khác dễ hiểu và nhanh chóng hơn". May mắn thay, cuối cùng đã có một cách giải như thế.
    Thật vậy, ngay sau khi chiếu vua ban ra, một vị cao tăng trông bề ngoài giống như một kỳ nhân hạ sơn tới xin yết kiến hoàng đế. Vị cao tăng nói: "Thưa Bệ hạ, bài toán đố đó dễ quá, hầu như nó tự giải cho nó". Quan trùm cấm vệ đứng hầu ngay bên cạnh vua quắc mắt nhìn gã kỳ nhân, muốn quẳng gã ra ngoài, nhưng Hoàng đế vẫn kiên nhẫn tiếp tục lắng nghe. "Nếu chỉ có 1 đĩa, thì...; nếu có nhiều hơn 1 đĩa (n>1), thì...", cứ thế vị cao tăng bình tĩnh giảng giải. Im lặng được một lát, cuối cùng Hoàng đế sốt ruột gắt: "Được, thế cao tăng có nói rõ cho ta lời giải hay không cơ chứ?". Thay vì giải thích tiếp, gã kỳ nhân mỉm cười thâm thúy rồi biến mất, bởi vì hoàng đế tuy giỏi giang nhưng rõ ràng là chưa hiểu ý nghĩa của phép truy hồi (recursion). Nhưng các bạn sinh viên ngày nay thì có thể thấy cách giải của vị cao tăng là hoàn toàn đúng.

    Toàn bộ đoạn chữ nghiêng ở trên được trích nguyên văn từ cuốn sách giáo khoa dành cho sinh viên ngành thuật toán và lập trình - "giải toán nâng cao và cấu trúc dữ liệu" (intermediate problem solving and data structures) do Paul Henman và Robert Veroff, hai giáo sư Đại học New Mexico, cùng biên soạn với Frank Carrano, giáo sư Đại học Rhode Island (Mỹ).

    Bạn nào chưa từng biết Tháp Hà Nội thì cũng nên "thử sức" một chút xem sao, vì đây là một trò chơi rất thú vị. Bạn có thể bắt đầu bằng bài toán 3 đĩa, rồi nâng lên 4 đĩa. Với 4 đĩa chắc bạn bắt đầu thấy rắc rối. Nâng tiếp lên 5 và cao hơn nữa, chẳng hạn n = 1 triệu, bài toán sẽ rắc rối đến mức không ai đủ kiên trì và đủ thì giờ để thử từng đĩa một. Vậy mà vị cao tăng dám nói là dễ quá! Xin tiết lộ, ấy là vì vị đó đã sử dụng phép truy hồi - một quy tắc toán học cho phép xác định số hạng thứ n từ số hạng đứng trước nó, tức số hạng thứ n-1. Cái giỏi của vị cao tăng là ông tìm ra một quy tắc chung, tức một thuật toán chung cho tất cả các bước chuyển đĩa.

    Vậy thay vì mô tả toàn bộ quá trình chuyển đĩa từng cái một như những thí sinh trước đó đã làm, vị cao tăng chỉ mô tả một quy tắc chung. Cứ làm theo quy tắc đó, lặp đi lặp lại chẳng cần suy nghĩ gì, rồi cuối cùng tự nhiên sẽ tới đích. Vì thế vị cao tăng nói rằng bài toán này "tự nó giải nó".

    Trong khoa học tính toán ngày nay, phép truy hồi là thuật toán cơ bản để lập trình. Ưu điểm của phương pháp truy hồi là ở chỗ nó dùng một công thức nhất định để diễn tả những phép tính lặp đi lặp lại bất chấp số lần lặp lại là bao nhiêu. Nếu số lần lặp lại lên đến con số hàng triệu hàng tỷ thì con người không đủ sức và thời gian để làm, nhưng máy tính thì có thể giải quyết trong chớp mắt. Điểm mạnh của computer là ở chỗ nó không hề biết e ngại và mệt mỏi trước những công việc lặp đi lặp lại lên đến hàng triệu hàng tỷ lần. Và vì thế, việc cộng tác giữa computer với con người là mô hình lý tưởng của lao động trí óc trong cuộc sống hiện đại.

    Về mặt lịch sử, Tháp Hà Nội được E. Lucas phát hiện từ năm 1883, nhưng mãi đến gần đây người ta mới nhận ra ý nghĩa hiện đại của nó. Hiện vẫn chưa rõ vì sao Lucas lại gọi chồng đĩa trong bài toán là Tháp Hà Nội, mà không gọi là Tháp Bắc Kinh, hay Tháp Tokyo.

    Tháp Hà Nội đã mở tung cánh cửa cho tương lai khi nhiều nghiên cứu lấy Tháp Hà Nội làm điểm xuất phát đã đạt được thành tựu mới:

    (1) Nâng câu hỏi của Tháp Hà Nội lên một mức cao hơn, sao cho số lần chuyển đĩa là nhỏ nhất. Các nhà toán học đã phát hiện ra rằng Tháp Hà Nội có cùng bản chất với bài toán tìm Đường Hamilton (Hamilton Path) trên một hình giả phương cấp n (n-Hypercube), một bài toán cũng rất nổi tiếng.

    (2) Nhà toán học D.G. Poole đã sáng tạo ra Lược Đồ Hà Nội - một tam giác có các đỉnh tương ứng với các cách sắp xếp đĩa trong Tháp Hà Nội, từ đó tìm ra những liên hệ lý thú giữa Tam giác Pascal với Lược đồ Hà Nội. Liên hệ này đã được công bố trong một công trình mang một cái tên đầy liên tưởng: Pascal biết Hà Nội (Pascal knows Hanoi).

    Hiện nay, tại một số đại học ở Australia, uy tín của sinh viên Việt Nam trong lĩnh vực lập trình được đánh giá ngang với sinh viên Ấn Độ - một cường quốc lập trình của thế giới, làm cho Tháp Hà Nội vốn đã nổi tiếng lại càng nổi tiếng hơn.

    Sưu tầm

    Sau đây là mã nguồn của bạn MicroTuan viết:
    Attached Files Attached Files
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.
    Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Mặc định Cách giải Bài toán Tháp Hà Nội (Tower of Ha Noi)

    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:
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.
    Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.

  3. #3
    Ngày gia nhập
    04 2009
    Bài viết
    1

    Chưa đọc cuốn "Intermediate problem solving and data structures", nhưng em thấy trong cuốn "Structured computer organization" của Andrew S.Tanenbaum, có trình bày rất khác về lịch sử của bài toàn Hanoi Tower trong vấn đề recursive procedure.

    The Tower of Hanoi is an ancient problem that has a simple solution involving recursion. In a certain monastery in Hanoi, there are three gold pegs. Around the first one were a series of 64 concentric gold disks, each with a hole in the middle for the peg. Each disk is slightly smaller in diameter than the disk directly below it. The second and third pegs were initially empty. The monks there are busily transferring all the disks to peg 3, one disk at a time, but at no time may a larger disk rest on a smaller one. When they finish, it is said the world will come and end. If you wish to get hands on experience, it is all right to use plastic disks and fewer of them, but when you solve the problem, nothing will happen. To get the end of world effect, you need 64 of them and in gold.
    Hàm tính bài toán Hanoi Tower đc viết trong sách đơn giản (viết bằng Java), nghe thầy nói là thuật toán này do người nước ngoài gốc Việt viết :|

    Convert qua C:

    C Code:
    1. void HanoiTower(int n, int i, int j)
    2. {
    3.     int k;
    4.  
    5.     if(n==1)
    6.         printf("Move a disk from peg %d to peg %d\n",i,j);
    7.     else
    8.     {
    9.         k = 6-i-j;
    10.         HanoiTower(n-1,i,k);
    11.         HanoiTower(1,i,j);
    12.         HanoiTower(n-1,k,j);
    13.     }
    14. }
    Với n là số đĩa, i là thứ tự của cột chứa đĩa, j là thứ tự của cột cần chuyển hết đĩa qua, k là thứ tự của cột trung gian còn lại, vì vậy số 6 đó chắc mọi người đều hiểu.
    Thử nhập số đĩa n cao cao một chút, 64 chẳng hạn, kết quả sẽ có vào end of world.

  4. #4
    Ngày gia nhập
    08 2008
    Bài viết
    22

    Đây là code chương trình minh họa bài toán tháp Hà Nội, mình viết bằng VS 6.0. Chương trình sử dụng 2 thư viện là console.h và screen.h (tải trên mạng về). Hình như là screen.h chứa hàm delay thời gian (tại lâu quá mình không xem lại, với lại bây giờ đang dùng Borland C.
    Attached Files Attached Files

  5. #5
    Ngày gia nhập
    12 2008
    Bài viết
    117

    Mở rộng bài toán, giả sử ta có n (n>=3) cọc, tìm cách sao cho số lần di chuyển là ít nhất. (Đây là bài chế của bài toán tháp Hà Nội hay còn gọi là bài toán tháp Sài Gòn). Có thể thấy rằng với việc cho n=4 thôi thì bài toán đã trở nên phức tạp hơn rất nhiều.

  6. #6
    Ngày gia nhập
    12 2008
    Nơi ở
    Bình Dương
    Bài viết
    114

    Mặc định Bài toán Tháp Hà Nội | Tower of Hanoi

    nghe ông thầy nói,voíc tốc độ xử lý của máy tính hiện này, thì hình như là khoảng 52 cái đĩa thì bài toán này, sẽ "bất tử" mất, chạy hoài, không ra nổi phải ko?

  7. #7
    Ngày gia nhập
    04 2010
    Bài viết
    13

    em cũng xin góp 1 bài...cho thêm phần sinh động...
    C++ Code:
    1. #include<conio.h>
    2. #include<iostream.h>
    3. #include<process.h>
    4. void hn(int n,char a,char b,char c)
    5. {
    6.   if(n==1)
    7.     {
    8.     cout<<"\nchuyen 1 dia tu "<<a<<" sang "<<c;
    9.     cout<<"\n";
    10.     }
    11.   else
    12.      {
    13.        hn(n-1,a,c,b);
    14.        hn(1,a,b,c);
    15.        hn(n-1,b,a,c);
    16.      }
    17. }
    18. void main()
    19. {
    20.    int n;
    21.    clrscr();
    22.    cout<<"nhap vao so dia:";
    23.    cin>>n;
    24.    hn(n,'A','B','C');
    25.    getch();
    26. }

  8. #8
    Ngày gia nhập
    04 2010
    Nơi ở
    Recycle Bin
    Bài viết
    358

    Đóng góp code
    C Code:
    1. /* Bai toan thap HN */
    2. #include<stdio.h>
    3. #include<conio.h>
    4.  
    5. void DICH_CHUYEN(int n, int c1, int c2,int c3)
    6. {
    7.  if(n==1) printf("\n\t%d ->%d",c1,c2);
    8.  else
    9.     {
    10.      DICH_CHUYEN(n-1,c1,c3,c2);
    11.      DICH_CHUYEN(1,c1,c2,c3);
    12.      DICH_CHUYEN(n-1,c3,c2,c1);
    13.     }
    14. }
    15.  
    16. void main()
    17.   {
    18.    int n,c1=1,c2=2,c3=3;
    19.    clrscr();
    20.    printf("\ncho so dia can chuyen:");scanf("%d",&n);
    21.    DICH_CHUYEN(n,c1,c2,c3);
    22.    getch();
    23.   }
    YH : lobuocphuudu_218
    Phone : 0126 463 5095

    http://forums.congdongcviet.com/signaturepics/sigpic55872_2.gif

  9. #9
    Ngày gia nhập
    06 2010
    Bài viết
    1

    Có ai biết độ phức tạp thuật toán này là cỡ nhiêu không?
    trong môn phân tích độ phức tạp của thuật toán - thì nó là cỡ O nào?
    mà theo mình biết thì bài toán này là do 1 người ấn độ nghĩ ra mà, tên là ha noi. đến việt nam sao đổi thành hà nội

  10. #10
    Ngày gia nhập
    05 2010
    Bài viết
    265

    Trích dẫn Nguyên bản được gửi bởi theanhkkt Xem bài viết
    Có ai biết độ phức tạp thuật toán này là cỡ nhiêu không?
    trong môn phân tích độ phức tạp của thuật toán - thì nó là cỡ O nào?
    mà theo mình biết thì bài toán này là do 1 người ấn độ nghĩ ra mà, tên là ha noi. đến việt nam sao đổi thành hà nội
    Tính được mà bạn. Gọi T(n) là số phép dịch chuyển n cái đĩa, khi đó Công thức toán học Latex

Các đề tài tương tự

  1. Cho thuê Căn hộ 3pn,1000 USD, đủ đồ, Chung cư Keangnam HaNoi landmark Tower
    Gửi bởi kyucmotthoi999 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 22-11-2013, 10:45 AM
  2. Bán suất ngoại giao chung cư Indochina Plaza Hanoi Tower ( IPH )
    Gửi bởi hienviboss trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 1
    Bài viết cuối: 23-07-2012, 03:52 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn