如果你不知道 河内塔是,我将简要解释一下:三根杆和一些圆盘的尺寸各不相同。最初,所有光盘都按顺序排列在第一塔上:最大的光盘在底部,最小的光盘在顶部。目的是将所有圆盘移至第三杆。听起来容易吗?要注意的是:您不能将光盘放置在比另一张光盘小的光盘上。您一次只能拿一个光盘将它们移动到另一根棒上,并且您只能将光盘放在棒上,而不是放在桌子上,这是一个卑鄙的混蛋。
ascii示例解决方案:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
挑战
有三个杆,分别称为A,B和C。(如果有帮助,您也可以分别称呼它们1,2和3)。一开始,所有n个圆盘都位于杆A(1)上。
您的挑战是验证河内塔的解决方案。您需要确保:
- 最后,所有n个圆盘都位于杆C(3)上。
- 对于处于任何给定状态的任何给定光盘,其下方都没有较小的光盘。
- 没有明显的错误,例如尝试将光盘从空的杆中取出或将光盘移至不存在的杆中。
(解决方案不一定是最佳的。)
输入值
您的程序将收到两个输入:
- 光盘数量n(整数)
所采取的移动,将由以下一组元组组成:(塔以从中取出当前最上面的光盘),(塔以从中取出该光盘)每个元组都指一个移动。您可以选择它们的表示方式。例如,类似下面的方式,我在上面的ascii中绘制了n = 2的解决方案。(我将在测试用例中使用第一个,因为它很容易在眼睛上看到):
“ 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]
输出量
真实,如果可以在“挑战”下找到条件。
虚假,如果他们不这样做。
测试用例:
真正:
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"
假:
@MartinEnder建议的第三名,@ 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"
这是代码高尔夫,最短的解决方案胜出。适用标准规则和漏洞。不含电池。
A->A
吗?
moving discs to nonexistant rods.
是的,它是D
A=1
,B=2
,C=3
等等)?