Nếu bạn không biết Tháp Hà Nội là gì, tôi sẽ giải thích ngắn gọn: Có ba thanh và một số đĩa có kích thước khác nhau. Ban đầu, tất cả các đĩa đều nằm trên tháp đầu tiên, theo thứ tự được sắp xếp: Cái lớn nhất nằm ở dưới cùng, nhỏ nhất ở trên cùng. Mục tiêu là đưa tất cả các đĩa qua thanh thứ ba. Nghe có vẻ dễ dàng? Đây là một nhược điểm: Bạn không thể đặt một đĩa lên trên một đĩa nhỏ hơn đĩa khác; bạn chỉ có thể cầm một đĩa trong tay một lúc để di chuyển chúng sang một thanh khác và bạn chỉ có thể đặt đĩa lên que chứ không phải trên bàn, bạn lén lút.
giải pháp ví dụ ascii:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
Thử thách
Có ba thanh được gọi là A, B và C. (Bạn cũng có thể gọi chúng là 1,2 và 3 một cách tôn trọng nếu điều đó có ích) Lúc đầu, tất cả n đĩa đều nằm trên thanh A (1).
Thách thức của bạn là xác minh một giải pháp cho tòa tháp hà nội. Bạn sẽ cần đảm bảo rằng:
- Cuối cùng, tất cả n đĩa đều nằm trên thanh C (3).
- Đối với bất kỳ đĩa nhất định tại bất kỳ trạng thái nhất định, không có đĩa nhỏ hơn bên dưới nó.
- Không có lỗi rõ ràng như cố gắng lấy đĩa từ một thanh trống hoặc di chuyển đĩa sang thanh không tồn tại.
(giải pháp không phải là tối ưu.)
Đầu vào
Chương trình của bạn sẽ nhận được hai đầu vào:
- Số lượng đĩa n (một số nguyên)
Các động tác được thực hiện, sẽ bao gồm một bộ các bộ dữ liệu: (tháp để lấy đĩa cao nhất hiện tại), (tháp để đưa đĩa này đến) trong đó mỗi bộ dữ liệu đề cập đến một di chuyển. Bạn có thể chọn cách chúng được đại diện. Ví dụ, một cái gì đó giống như các cách biểu diễn giải pháp sau đây cho n = 2 mà tôi đã vẽ ở ascii ở trên. (Tôi sẽ sử dụng cái đầu tiên trong các trường hợp thử nghiệm, vì nó dễ nhìn):
"A-> B; A-> C; B-> C"
[("A", "B"), ("A", "C"), ("B", "C")]
[(1,2), (1,3), (2,3)]
"ABACBC"
[1,2,1,3,2,3]
Đầu ra
Sự thật, nếu các điều kiện có thể được tìm thấy trong "thách thức" giữ.
Falsy, nếu họ không.
Các trường hợp thử nghiệm:
Thật:
n=1, "A->C"
n=1, "A->B ; B->C"
n=2, "A->B ; A->C ; B->C"
n=2, "A->C ; C->B ; A->C ; B->C"
n=2, "A->C ; A->B ; C->B ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C ; B->C"
Sai:
Cái thứ 3 được đề xuất bởi @MartinEnder, thứ 7 bởi @Joffan
n=1, "A->B"
n=1, "C->A"
n=2, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=2, "A->B ; A->C ; C->B"
n=2, "A->C ; A->B ; C->B ; B->A"
n=2, "A->C ; A->C"
n=3, "A->B ; A->D; A->C ; D->C ; A->C"
n=3, "A->C ; A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->B ; B->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; C->B"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C"
n=4, "A->B ; A->B ; A->B ; A->C ; B->C ; B->C ; B->C"
Đây là mã golf , giải pháp ngắn nhất thắng. Quy tắc tiêu chuẩn và sơ hở áp dụng. Không có pin bao gồm.
A->A
nào không?
moving discs to nonexistant rods.
vì vậy tất nhiên là có, đó làD
A=1
,B=2
,C=3
, vv)?