#P2090. Two-Stacks Solitaire

Two-Stacks Solitaire

题目翻译

单人纸牌游戏在英国被称为“Patience”,在美国被称为“Solitaire”。其中一种非常困难(有些人说令人抓狂)的纸牌游戏叫做“双堆栈”(Two-Stacks),其规则如下:

牌桌布局 牌桌包括一个库存堆(stock pile)、两个中间堆(intermediate piles)和一个目标堆(foundation pile)。

纸牌 游戏可以使用最多四副完整的牌组,或部分牌组。一副完整的牌组包含5252张牌;由于牌组中的牌可以排序,在此描述中,我们将忽略花色和牌面,仅用数字115252表示一副牌中的牌。

发牌 选定游戏中使用的牌后,将它们面朝上依次发到牌桌上,一张叠一张,形成库存堆。

移动牌 每次只能移动一张牌。一张牌可以从库存堆移动到其中一个中间堆,或者从一个中间堆移动到目标堆。在堆(库存堆或中间堆)中,只能移动最上面的一张牌,尽管其他牌也是可见的。

目标 目标是将游戏中使用的所有牌按非递减顺序(从下到上)排列,构成目标堆。

你可能已经注意到,即使存在解决方案,赢得“双堆栈”纸牌游戏的机会也非常低。但你的祖母刚刚学会了这个游戏并且非常喜欢。她请你帮她学习游戏,编写一个程序来指导她的初次尝试,展示应该如何移动牌。

输入

输入包含多个测试用例。每个测试用例的第一行是一个整数NN11NN208208),表示游戏中牌的数量。第二行是NN个整数(115252之间),用空格分隔,表示牌的顺序。牌会按照输入的顺序发到库存堆,因此库存堆的最上面一张牌是输入的第二行中的第NN个数字。注意,每个数字115252在每个测试用例中最多出现44次。输入以NN = 00的测试用例结束。

输出

对于每个测试用例,程序需要输出一个答案。答案的第一行是测试用例的标识符,格式为“#i”,其中ii11开始递增。如果可以赢得游戏,则输出一系列移动步骤。每个移动步骤单独一行,格式为“push xx”或“pop xx”,其中xx1122;“push xx”表示将库存堆的最上面一张牌移动到中间堆xx,“pop xx”表示将中间堆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