很简单呢的一道题,定义了一个结构体数组,用vector来做为一个牌堆。将尾部作为牌堆的顶部。
要注意,当最后只剩一堆牌的时候,答案中的pile不加s
#include<bits/stdc++.h>
using namespace std;
const int maxn = 60;
int b[60];
struct pile {
vector<string> a;
};
int main() {
ios::sync_with_stdio(false);
string buf;
while(cin>>buf) {
if(buf=="#") break;
pile s[maxn];
s[1].a.push_back(buf);
for(int i=2;i<=52;i++){
cin>>buf;
s[i].a.push_back(buf);
}
while(1) {
bool flage=false;
for(int i=2;i<=52;i++){
if(!s[i].a.empty()){
int kase=0,x; bool cnt=false,bbc=true;
for(int j=i;j>=1;j--){
if(!s[j].a.empty()) kase++;
if(kase==2&&bbc) {
if((s[i].a.back()[0]==s[j].a.back()[0]||s[i].a.back()[1]==s[j].a.back()[1])) { x=j; cnt=true; }
bbc=false;
}
if(kase<4&&j==1&&cnt){
s[x].a.push_back(s[i].a.back()); s[i].a.pop_back(); flage=true; break;
}
if(kase==4&&(s[i].a.back()[0]==s[j].a.back()[0]||s[i].a.back()[1]==s[j].a.back()[1])){
s[j].a.push_back(s[i].a.back()); s[i].a.pop_back(); flage=true; break;
}
else if(kase==4&&cnt) {
s[x].a.push_back(s[i].a.back()); s[i].a.pop_back(); flage=true; break;
}
else if(kase==4) break;
}
}
if(flage) break;
}
if(!flage) break;
}
int ans=0;
for(int i=1;i<=52;i++)
if(!s[i].a.empty()) { b[ans]=s[i].a.size();ans++; }
if(ans!=1)
cout<<ans<<" piles remaining:";
else cout<<ans<<" pile remaining:";
for(int i=0;i<ans;i++)
cout<<" "<<b[i];
cout<<"\n";
}
return 0;
}