UVA127-纸牌游戏
小白书里数据结构基础的第一题
翻译请戳 http://luckycat.kshs.kh.edu.tw/
解题思路:
用栈来表示纸牌的移动。初始的时候建立52个栈,每个栈一个元素。
再开个数组存储top指针。如果栈空,纸牌移动的时候不要理他就行了。
正确找到纸牌放置的位置后,出栈,入栈。
要注意, 每次放置完,要从头(最左边)开始搜索下一个可以移动的纸牌,直到没有纸牌可以移动。
每次读入一张纸牌就判断是否可以移动。直到放完52张牌。
代码:
#include<stdio.h>
const int MAX_LEN = 52+1;
int top[MAX_LEN];
int len, x;
struct Card {
char num, deg;
};
Card stack[MAX_LEN][MAX_LEN];
int FindNext(int index, int tot) //找到纸牌应该放置的位置
{
int i = index;
while(tot && i>=0) {
if(top[i] != -1) { tot--; i--; }
else i--;
}
while(top[i] == -1 && i>=0)
i--;
return i;
}
bool Match(Card card1, Card card2) //判断纸牌是否可以放上去
{
if(card2.num == card1.num || card2.deg == card1.deg) return true;
return false;
}
void Conquer() //不断移动纸牌,直到没有纸牌可以移动
{
bool flag = false, first = true;
while(flag || first) {
bool change = false;
for(int i=1; i< x ; i++) {
if(top[i]<0) continue;
int j = FindNext(i, 3);
if(j>=0 && Match(stack[j][top[j]], stack[i][top[i]])) {
change = true;
stack[j][++top[j]] = stack[i][top[i]];
top[i]--;
if(top[i] == -1) len--;
break;
}
else {
j = FindNext(i, 1);
if(j>=0 && Match(stack[j][top[j]], stack[i][top[i]])) {
change = true;
stack[j][++top[j]] = stack[i][top[i]];
top[i]--;
if(top[i] == -1) len--;
break;
}
}
}
if(!change) flag = false; else flag = true;
if(first) first = false;
}
}
int main()
{
char c;
c = getchar();
while(c != '#') {
len = 0;
for(int i=0; i<MAX_LEN; i++) {stack[i][0].num = stack[i][0].deg = 0;top[i] = 0;}
stack[len][top[len]].num = c;
stack[len][top[len]].deg = getchar();
x = 0;
while(x < 52 && c != '#') {
if((c=getchar()) == ' ' || c == '\n')
{
x++;
Conquer();
len++;
}
else if(stack[x][top[x]].num == 0) stack[x][top[x]].num = c;
else stack[x][top[x]].deg = c;
}
Conquer();
printf(len == 1?"%d pile remaining:":"%d piles remaining:", len);
for(int i=0; i<x; i++) if(top[i] != -1) printf(" %d", top[i]+1);
printf("\n");
c = getchar();
}
return 0;
}