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