水题一道,不过是第一次用数组实现链表,形式上貌似更简洁,代码量也少,不过有些细节第一次写所以还没习惯,比如用指针时是p->left,用数组的话是left[i],想着很明白,但是不经意间就会写成i-1。
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char crd[53][53][5];
int top[53];
int l[53],r[53];
int sum;
int can(int n,int m){
if(crd[n][ top[n] ][0]==crd[m][ top[m] ][0]
||crd[n][ top[n] ][1]==crd[m][ top[m] ][1]) return 1;
return 0;
}
void act(int m,int n){
int &tm=top[m],&tn=top[n];
strcpy(crd[m][++tm],crd[n][tn--]);
if(tn<0) { l[r[n]]=l[n], r[l[n]]=r[n], sum--; }
}
int move(int n){
int m=n;
for(int i=0;i<3&&m>=0;i++) m=l[m];
if(m>=0&&can(n,m)) {act(m,n);return 1;}
m=l[n];
if(m>=0&&can(n,m)) {act(m,n);return 1;}
return 0;
}
int main()
{
while(1){
scanf("%s",crd[0][0]); if(crd[0][0][0]=='#') break;
for(int i=1;i<52;i++) scanf("%s",crd[i][0]);
sum=52;
for(int i=0;i<52;i++){
top[i]=0; l[i]=i-1; r[i]=i+1;
}
int ok=1;
while(ok){
ok=0;
for(int i=0;i<52;i=r[i])
if(move(i)) {ok=1;break;}
}
cout<<sum<<" pile"; if(sum>1) cout<<'s'; cout<<" remaining:";
for(int i=0;i<52;i=r[i]) cout<<' '<<top[i]+1; cout<<endl;
}
return 0;
}