Video: BÀI TẬP LẬP TRÌNH C 4.1 - CHƯƠNG TRÌNH IN RA CÁC SỐ NGUYÊN TỐ TRONG KHOẢNG TỪ 1 ĐẾN N 2025
Thử thách này sẽ giúp bạn sử dụng tài năng lập trình của mình để viết một chương trình Java sẽ in ra các bước cần thiết để giải quyết một câu đố Tower of Hanoi với số lượng đĩa.
Tháp Hà Nội là một câu đố logic cổ điển bao gồm ba chốt đứng và một số đĩa có đường kính khác nhau. Mỗi đĩa có một lỗ ở giữa, cho phép đĩa được trượt trên ghim.
Câu đố bắt đầu với tất cả các đĩa xếp chồng lên một trong những cái chốt, với đĩa lớn nhất ở dưới cùng và nhỏ nhất ở đầu trang. Đối tượng của câu đố là di chuyển đống đĩa vào một trong các chốt khác, tuân theo hai quy tắc đơn giản: (1) bạn chỉ có thể di chuyển một đĩa cùng lúc, và (2) bạn không bao giờ có thể đặt đĩa lớn hơn vào đầu của một cái nhỏ hơn.
Hình dưới đây cho thấy giải pháp cho một chồng ba đĩa. Như bạn thấy, giải pháp đòi hỏi 7 bước:
-
Di chuyển Disk 1 từ Peg 1 đến Peg 3.
-
Di chuyển Disk 2 từ Peg 1 đến Peg 2.
-
Move Disk 1 từ Peg 3 đến Peg 2.
-
Di chuyển Disk 3 từ Peg 1 đến Peg 3.
-
Di chuyển Disk 1 từ Peg 2 sang Peg 1.
-
Di chuyển Disk 2 từ Peg 2 đến Peg 3.
-
Giải pháp cho Tháp Hà Nội với ba đĩa.
Câu đố thú vị khi bạn bắt đầu thêm đĩa vào vị trí bắt đầu. Với ba đĩa, câu đố chỉ đòi hỏi 7 bước để giải quyết. Với bốn đĩa, 15 động được yêu cầu. Với năm đĩa, bạn sẽ cần 31 di chuyển. Sáu đĩa đòi hỏi 64 bước.
Nếu bạn theo dõi bài toán, số lần di chuyển cần thiết để giải quyết câu đố tăng dần theo số lượng đĩa tăng lên. Cụ thể, số lần di chuyển cần thiết để di chuyển đĩa
nlà 2 n - 1. Ví dụ, một chồng 20 đĩa sẽ yêu cầu 2 20 - 1 di chuyển; đó là hơn một triệu di chuyển! Một huyền thoại thú vị có liên quan đến câu đố: Tại một ngôi chùa ở Hà Nội, các nhà sư đã làm việc trên một tháp Towers của Hà Nội với 64 đĩa kể từ khi tạo ra trái đất. Khi họ kết thúc, thế giới sẽ chấm dứt. Thật may mắn, chúng ta phải chờ đợi rất lâu: Nếu các nhà sư có thể di chuyển một đĩa mỗi giây, sẽ là 580 tỷ năm nữa trước khi họ hoàn thành câu đố. Thách thức của bạn rất đơn giản: Viết một chương trình Java sẽ in các bước cần thiết để giải quyết một tháp Towers của Hà Nội cho số lượng đĩa. Chương trình đầu tiên nên nhắc nhở người dùng về số lượng đĩa. Sau đó, nó sẽ hiển thị các bước, một trong mỗi dòng.Mỗi bước cần chỉ ra cái chốt nào để di chuyển một đĩa từ đó, và có chốt để di chuyển đĩa. Các bước cũng nên được đánh số theo thứ tự.
Sau khi hoàn tất, chương trình nên lặp lại, yêu cầu người sử dụng về số lượng đĩa một lần nữa. Chương trình sẽ kết thúc khi người dùng nhập 0.
Đây là một mẫu của giao diện điều khiển mà chương trình của bạn sẽ tạo ra:
Có bao nhiêu đĩa? (0 đến kết thúc)
3
1: 1 đến 3 2: 1 đến 2 3: 3 to 2 4: 1 đến 3 5: 2 to 1 6: 2 to 3 7: 1 to 3 Có bao nhiêu đĩa ? (0 để kết thúc) 0 Chỉ có yêu cầu khác để giải quyết vấn đề này là giải pháp của bạn phải sử dụng chương trình đệ quy. Nói cách khác, giải pháp của bạn phải bao gồm một phương pháp tự gọi mình là để giải quyết câu đố. Lập trình đệ quy có thể là một thách thức, vì vậy đây là một vài gợi ý cho giải pháp của câu đố này:
Câu đố bao gồm ba cái chốt. Một trong số chúng chứa các stack bắt đầu của đĩa; gọi cái chốt này
chốt nguồn
-
. Một trong hai cái còn lại là ghim mà bạn muốn di chuyển đống đĩa vào; gọi cái chốt này mục tiêu bị khóa . Chốt thứ ba có sẵn để bạn sử dụng như một chốt trung gian để lưu trữ đĩa tạm thời khi bạn di chuyển chúng. Hãy gọi cái chốt này là giá đỡ phụ . Phương thức đệ quy của bạn nên chấp nhận ba tham số: số lượng đĩa cần di chuyển, chốt nguồn, và chốt mục tiêu. Sử dụng các số nguyên 1, 2, và 3 để biểu diễn các chốt. Ý tưởng cơ bản của việc giải quyết các câu đố đệ quy là: Để di chuyển một đống đĩa từ một chốt nguồn đến một chốt mục tiêu đòi hỏi ba bước:
-
Di chuyển tất cả các đĩa trong ngăn xếp ngoại trừ đĩa đáy phụ tùng.
-
Di chuyển đĩa lớn nhất trong ngăn xếp ban đầu đến chốt đích.
-
Di chuyển ngăn xếp mà bạn đã di chuyển trong Bước 1 từ chốt bổ sung vào ghim mục tiêu.
-
Tất nhiên, các quy tắc cho phép bạn di chuyển chỉ một đĩa mỗi lần, vì vậy bạn không thể hoàn thành Bước 1 và 3 của thủ tục được đưa ra ở đây bằng cách chỉ đơn giản là chọn lên ngăn xếp và di chuyển nó. Đó là nơi mà đệ quy đưa vào. Đối với bước 1 và 3, bạn gọi phương pháp đệ quy, mỗi lần chỉ định một ít đĩa hơn sẽ được di chuyển, và mỗi lần sử dụng chốt mục tiêu trước đó làm chốt bổ sung.
-
Tự hỏi lý do tại sao phương pháp đệ quy không cần phải chấp nhận chốt bổ sung như một đối số? Bởi vì bạn có thể dễ dàng tính toán nó, cho nguồn và đích chốt. Vì chỉ có ba chốt, được đánh số 1, 2 và 3, tổng của ba chốt là 6 (1 + 2 + 3). Với chốt nguồn và đích, bạn có thể tính toán chốt bằng cách lấy đi phần chốt nguồn và đích từ 6. Ví dụ, nếu chốt nguồn là 1 và chốt mục tiêu là 3, thì chốt bổ sung phải là 2 vì
-
-
6 - 3 - 1 = 2.
-
Để có giải pháp, hãy đi tới tab Tải xuống của
Máy tính Java cho tất cả mọi người,
trang sản phẩm Ấn bản lần 4. Chúc may mắn!