很简单呢的一道题,定义了一个结构体数组,用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; }
时间: 2024-10-12 23:47:52