UVA 127 "Accordian" Patience (模拟)

        就把CSDN当成保存UVA做题代码的一个地方好了。。。 

#include <stdio.h>
#include <string.h>

struct _r {
    char a[53][3];
    int x;
}r[53]; // 定义好要用的数据结构

// 移动处理函数
void deal(int n, int s) {

    int left = r[n-s].x;
    int right = r[n].x;
    for (int i=0; i<3; i++) {
        r[n-s].a[left+1][i] = r[n].a[right][i];
    }

    r[n-s].x++;
    r[n].x--;

    if (r[n].x >= 0)
        return;

    for (int i=n; i<52; i++)
        r[i] = r[i+1];
}

int main() {

    while (1) {
        scanf("%s", r[0].a[0]);
        if ('#' == r[0].a[0][0])
            break;
        r[0].x = 0;
        r[52].x = -1;
        for (int i=1; i<52; i++) {
            scanf("%s", r[i].a[0]);
            r[i].x = 0;
        }

        bool flag = true;
        int nCount = 0;
        while (flag) {
            int i;
            for (i=1; r[i].x!=-1; i++) {
                int left = r[i-3].x;
                int right = r[i].x;
                if (i>0 && (r[i].a[right][0]==r[i-3].a[left][0]
                    || r[i].a[right][1]==r[i-3].a[left][1])) {

                    deal(i, 3);
                    flag = false;
                    break;
                }
                left = r[i-1].x;
                right = r[i].x;
                if (r[i].a[right][0]==r[i-1].a[left][0]
                    || r[i].a[right][1]==r[i-1].a[left][1]) {

                    deal(i, 1);
                    flag = false;
                    break;
                }
            }
            nCount = i;
            // 判断有没有交换,如果没有的话就跳出while()函数
            if (true == flag)
                flag = false;
            else
                flag = true;
        }
        if (nCount > 1)
            printf("%d piles remaining:", nCount);
        else
            printf("%d pile remaining:", nCount);
        for (int i=0; r[i].x != -1; i++)
            printf(" %d", r[i].x+1);
        puts("");
    }

    return 0;
}

原文地址:https://www.cnblogs.com/zcube/p/4194537.html