题目:(摘自星星之火的百度空间)
你的任务是模拟一种叫「Accordian」的纸牌游戏,他的游戏规则如下:
一副扑克牌有52张牌,首先把纸牌一张一张由左到右排好(不能有重叠,所以共有52堆牌,每堆一张),当某一张牌与他左边那张牌或者左边的第三张牌有「Match」的时候,就把这张牌移到那张牌上面去。在这里两张牌「Match」指的是这两张牌的花色(suit)或者点数(rank)一样。当你做了一个移动之后,要察看是否还可以做其他的移动。在任何时间,只有最上面那张牌可以被移动。如果因为移动一张牌使得产生一个空格(也就是被移动的那堆牌只有一张牌),你必须把右边所有的牌堆往左移一格。如此不断的寻找可移动的牌,直到没有一张牌可以移动游戏就结束了。
在选择可以移动的牌的时候可能有些状况会发生。如果有两张牌都可以移动,你应该要移动最左边的那张牌。当一张牌可以被移动到左边一格,或左边三格的时候,你必须移动到左边三格。
Input
输入包含多组测试资料。每组测试资料两列,每列有26张牌的资料。每张牌以2个字元代表。第一个字元代表牌的点数(A=Ace, 2~9, T=10, J=Jack, Q=Queen, K=King),第二个字元代表牌的花色(C=Clubs, D =Diamonds, H=Hearts, S=Spades)
若遇到仅含#的一列代表输入结束。请参考Sample Input。
Output
对每组测试资料输出游戏结束时剩下几堆牌,以及每堆牌有多少张牌。请注意如果只有1堆牌,pile后没有加s,请参考Sample Output。
#include <cstdio>
#include <iostream>
#include <stack>
using namespace std;
int nSize ;
struct String
{
char face[3];
};
struct Pile
{
stack<String>face;
}arr[100];
int prev[100],next[100];
void DelGaps()
{
int i,j;
for( i = 0 ; i != nSize ; i=next[i])
{
if(arr[i].face.empty())
{
next[prev[i]] = next[i];
prev[next[i]] = prev[i];
return ;
}
}
}
bool Move()
{
int cnt = 1;
for(int i = next[0] ; i != nSize ; i = next[i],cnt++)
{
int last3,last1;
if(cnt>2)
{
last3 = prev[prev[prev[i]]];
if(arr[i].face.top().face[0]==arr[last3].face.top().face[0]
||arr[i].face.top().face[1]==arr[last3].face.top().face[1])
{
arr[last3].face.push(arr[i].face.top());
arr[i].face.pop();
return true;
}
}
last1 = prev[i];
if(arr[i].face.top().face[0]==arr[last1].face.top().face[0]
||arr[i].face.top().face[1]==arr[last1].face.top().face[1])
{
arr[last1].face.push(arr[i].face.top());
arr[i].face.pop();
return true;
}
}
return false;;
}
void solve()
{
while(Move())
DelGaps();
}
int main()
{
nSize = 0 ;
String temp;
while(scanf("%s",temp.face)!=EOF)
{
if(temp.face[0]=='#') break;
while(!arr[nSize].face.empty())
arr[nSize].face.pop();
arr[nSize].face.push(temp);
prev[nSize] = nSize - 1 ;
next[nSize] = nSize + 1 ;
nSize++;
if(nSize == 52)
{
solve();
int num = 0 ;
for(int i = 0 ; i != nSize ; i=next[i])
num++;
if(num == 1 ) printf("1 pile remaining: ");
else printf("%d piles remaining: ",num);
for(int i = 0 ; i != nSize ; i=next[i])
{
if(i) printf(" ");
printf("%d",arr[i].face.size());
}
printf("\n");
nSize = 0 ;
}
}
return 0;
}