uva 127 "Accordian" Patience 简单模拟
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<stdio.h> #include<math.h> #include<stack> #include<list> #include<stdlib.h> #include<string.h> using namespace std; char da[55][55][5]; int num[55]; int pilenum; void erase(int idx) { for(int i=idx;i<pilenum;i++) { memcpy(da[i],da[i+1],sizeof(da[0])); num[i]=num[i+1]; } pilenum--; } int deal() { int isdeal=0; for(int i=1;i<=pilenum;i++) { if(i>3) { if(da[i][num[i]][0]==da[i-3][num[i-3]][0]|| da[i][num[i]][1]==da[i-3][num[i-3]][1]) { num[i-3]++; strcpy(da[i-3][num[i-3]],da[i][num[i]]); num[i]--; if(num[i]==0)erase(i); return 1; } } if(i>1) { if(da[i][num[i]][0]==da[i-1][num[i-1]][0]|| da[i][num[i]][1]==da[i-1][num[i-1]][1]) { num[i-1]++; strcpy(da[i-1][num[i-1]],da[i][num[i]]); num[i]--; if(num[i]==0)erase(i); return 1; } } } return isdeal; } int main() { while(scanf("%s",da[1][1])!=EOF) { if(da[1][1][0]=='#')break; for(int i=1;i<=52;i++) num[i]=1; for(int i=2;i<=52;i++) scanf("%s",da[i][1]); pilenum=52; while(deal()); if(pilenum==1) { printf("1 pile remaining: 52\n"); }else { printf("%d piles remaining:",pilenum); for(int i=1;i<=pilenum;i++) printf(" %d",num[i]); printf("\n"); } } return 0; }