Educational Backtracking: Tháp Hà Nội 2

Xem dạng PDF

Gửi bài giải


Điểm: 0,10 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 512M
Input: stdin
Output: stdout

Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Trò chơi tháp Hà Nội là trò chơi nổi tiếng với những chiếc đĩa có kích thước đôi một khác nhau, có lỗ nằm ở giữa, nằm xuyên trên ba chiếc cọc A, B, C

Trò chơi bắt đầu bằng trạng thái các đĩa được chồng lên nhau ở cọc A, đĩa nhỏ nằm trên đĩa lớn, tức là đĩa nhỏ nhất được nằm trên cùng, tạo ra một dạng hình nón. Yêu cầu của trò chơi là chuyển toàn bộ số đĩa từ cọc A sang cọc C, tuân theo các quy tắc sau:

  • Chỉ sử dụng 3 cọc để chuyển.

  • Một lần chỉ được di chuyển một đĩa nằm trên cùng từ cọc này sang cọc khác.

  • Một đĩa chỉ được đặt lên một đĩa lớn hơn.

Trong bài toán này, chúng ta sẽ có n chiếc đĩa, đánh số từ 1 đến n theo thứ tự kích thước đĩa tăng dần. Ban đầu, các đĩa nằm rải rác ở ba cọc nhưng vẫn thỏa mãn điều kiện đĩa nhỏ nằm trên đĩa lớn và mục tiêu là chuyển toàn bộ đĩa thành một chồng đĩa ở cọc C.

Yêu cầu: Cho trạng thái các đĩa nằm ở các cọc, hãy tìm cách chuyển toàn bộ đĩa thành một chồng đĩa ở cọc C.

Input

  • Dòng đầu chứa số nguyên dương n.

  • Dòng thứ hai chứa một xâu gồm ~n~ kí tự, kí tự thứ ~i~ ~(i = 1,2, ..., n)~ bằng 'A' hoặc 'B' hoặc 'C' cho biết đĩa thứ i nằm ở cọc A hay cọc B hay cọc C.

Output

  • Dòng đầu chứa số nguyên ~s~ là số lần chuyển đĩa.

  • Dòng thứ ~j~ ~(j = 1, 2, ..., s)~ trong ~s~ dòng tiếp theo, mỗi dòng gồm đúng hai kí tự mô tả một thao tác chuyển đĩa. Cụ thể, kí tự thứ nhất là tên cọc chứa đĩa cần chuyển, kí tự thứ hai là tên cọc mà đĩa chuyển tới.

Scoring

  • Có 20% số test tương ứng với 20% số điểm bài có với ~n = 3~.

  • Có 30% số test khác ứng với 30% số điểm của bài có ~n \le 10~ và cả ~n~ đĩa ban đầu ở cọc A.

  • Có 20% số test khác ứng với 20% số điểm của bài có ~n \le 10~.

  • Có 30% số test còn lại với 30% số điểm còn lại của bài có ~n \le 20~.

Sample Input 1

3
AAC

Sample Output 1

3
AB
AC
BC

Notes


Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 1
    neptune_170_nt  đã bình luận lúc 28, Tháng 2, 2023, 8:58

    Ý tưởng

    Để chuyển hết n đĩa sang cọc C thì trước đó ta phải chuyển hết 1 -> n-1 đĩa sang cọc C. Mục đích là để lấy được các đĩa lớn hơn ở dưới cùng

    Lúc đó, chuyển hết k đĩa sang cọc C rồi ta sẽ lấy được đĩa k + 1 để tiếp tục chuyển

    code: https://stellarhold170nt.github.io/SourceCodePtit/backtracking/b12.html