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;
}

 

posted @ 2016-08-07 23:01  啊嘞  阅读(236)  评论(0编辑  收藏  举报