回 帖 发 新 帖 刷新版面

主题:经典老程序新算法

汉诺塔
    问题描述:
汉诺塔游戏是这样的:有三个桩(桩1,桩2和桩3)和N个半径不同的盘子。初始所有的盘子按半径从小到大堆叠在桩1上,半径最小的盘子在最上面。规则:每次只可以移动一个桩上最顶端的盘子到另一个桩上,而且不可以把大盘子堆在小盘子上。问题是要把所有盘子移动到桩3上。
每次用两个整数a (1 <= a <= 3) 和 b (1 <= b <= 3)表示一次移动,表示移动桩a最顶端的盘子到桩b上。如果桩a上至少有一个盘子,而且桩a顶端的盘子可以在不违反规则的情况下移动到桩b上,那么这次移动才是一个有效的移动。
现给出一些移动步骤,请给出这些移动后的结果。

&#61656;    基本要求:
    输入:
    每次输入包含几个测试样例。
输入的第一行包含一个整数T (1 <= T <= 55),表示测试样例的个数。后面紧跟T个测试样例。
每个测试样例第一行有两个整数,n (1 <= n <= 10) 和 m (1 <= m <= 12000),表示有n个盘子,m次移动。后面m行表示具体的移动步骤。
    输出:
对每个测试样例,输出一行表示该测试样例最后的移动结果。
(1)    如果所有的盘子移动到桩3之前,第p次(从1开始记)移动是无效的移动,输出-p,忽略后面的移动步骤。
(2)    如果经过p次移动后,所有的盘子都已经移动到桩3,则输出p,并忽略后面的移动步骤。
(3)    其他情况输出0

&#61656;    测试样例:
样例输入
3
2 3
1 2
1 3
2 3
2 3
1 2
1 3
3 2
2 3
1 3
1 2
3 2
样例输出
3
-3
0
实现提示:可以使用三个堆栈,模拟汉诺塔移动的过程
堆栈不怎么会啊,望厉害大侠指点一下,谢谢

回复列表 (共1个回复)

沙发

期待答案

我来回复

您尚未登录,请登录后再回复。点此登录或注册