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