#P2090. Two-Stacks Solitaire
Two-Stacks Solitaire
题目翻译
单人纸牌游戏在英国被称为“Patience”,在美国被称为“Solitaire”。其中一种非常困难(有些人说令人抓狂)的纸牌游戏叫做“双堆栈”(Two-Stacks),其规则如下:
牌桌布局 牌桌包括一个库存堆(stock pile)、两个中间堆(intermediate piles)和一个目标堆(foundation pile)。
纸牌 游戏可以使用最多四副完整的牌组,或部分牌组。一副完整的牌组包含张牌;由于牌组中的牌可以排序,在此描述中,我们将忽略花色和牌面,仅用数字到表示一副牌中的牌。
发牌 选定游戏中使用的牌后,将它们面朝上依次发到牌桌上,一张叠一张,形成库存堆。
移动牌 每次只能移动一张牌。一张牌可以从库存堆移动到其中一个中间堆,或者从一个中间堆移动到目标堆。在堆(库存堆或中间堆)中,只能移动最上面的一张牌,尽管其他牌也是可见的。
目标 目标是将游戏中使用的所有牌按非递减顺序(从下到上)排列,构成目标堆。
你可能已经注意到,即使存在解决方案,赢得“双堆栈”纸牌游戏的机会也非常低。但你的祖母刚刚学会了这个游戏并且非常喜欢。她请你帮她学习游戏,编写一个程序来指导她的初次尝试,展示应该如何移动牌。
输入
输入包含多个测试用例。每个测试用例的第一行是一个整数( ≤ ≤ ),表示游戏中牌的数量。第二行是个整数(到之间),用空格分隔,表示牌的顺序。牌会按照输入的顺序发到库存堆,因此库存堆的最上面一张牌是输入的第二行中的第个数字。注意,每个数字到在每个测试用例中最多出现次。输入以 = 的测试用例结束。
输出
对于每个测试用例,程序需要输出一个答案。答案的第一行是测试用例的标识符,格式为“#i”,其中从开始递增。如果可以赢得游戏,则输出一系列移动步骤。每个移动步骤单独一行,格式为“push ”或“pop ”,其中是或;“push ”表示将库存堆的最上面一张牌移动到中间堆,“pop ”表示将中间堆x的最上面一张牌移动到目标堆。如果有多个解决方案,输出任意一个即可。如果无法赢得游戏,输出一行“impossible”。
输入数据 1
4
4 1 3 2
4
1 4 3 2
4
2 2 2 1
0
输出数据 1
#1
push 1
push 2
push 1
pop 1
pop 1
push 1
pop 2
pop 1
#2
impossible
#3
push 1
push 2
push 2
push 2
pop 1
pop 2
pop 2
pop 2