给出扑克牌堆,当堆顶的扑克与它左边或者左边第三堆的堆顶的扑克match(suit或rank相同),这张牌就移过去,优先移动三格,优先移动最左边牌堆顶的牌。
一开始用的string,stack,vector模拟的,在UVa上2.899s过了,后来学校有这个题,时间限制1s,进行了优化,VJ上测试0.999过的。
优化后代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include<cstdio> #include<cstdlib> #include<string> #include<vector> #include<stack> using namespace std; stack<char *>pile; vector<stack<char *> > piles,emp(52); bool read(){ piles=emp; char *s=(char *)malloc(3); scanf("%s",s); if(s[0]=='#') return false; piles[0].push(s); for(int i=1;i<52;++i){ s=(char *)malloc(3); scanf("%s",s); piles[i].push(s); } return true; } bool match(char *a,char *b){ return (a[0]==b[0]||a[1]==b[1]); } int move(int i){ if(i>2&&match(piles[i].top(),piles[i-3].top())){ piles[i-3].push(piles[i].top()); piles[i].pop(); if(piles[i].empty()) piles.erase(piles.begin()+i); return 4; } if(i>0&&match(piles[i].top(),piles[i-1].top())){ piles[i-1].push(piles[i].top()); piles[i].pop(); if(piles[i].empty()) piles.erase(piles.begin()+i); return 2; } return 0; } void solve(){ int k; for(int i=1;i<piles.size();i++){ k=move(i); if(k) i-=k; } return; } void print(){ printf("%d%s",piles.size(),piles.size()==1?" pile remaining: ":" piles remaining: "); for(int i=0;i<piles.size();++i){ if(i) printf(" "); printf("%d",piles[i].size()); } printf("\n"); return; } int main(){ while(read()){ solve(); print(); } return 0; }
|
原代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include<iostream> #include<string> #include<vector> #include<stack> using namespace std; stack<string>pile; vector<stack<string> >piles; bool read(){ ios::sync_with_stdio(false); string s; cin>>s; if(s=="#") return false; piles.push_back(pile); piles[0].push(s); for(int i=1;i<52;i++){ cin>>s; piles.push_back(pile); piles[i].push(s); } return true; } bool match(string a,string b){ return (a[0]==b[0]||a[1]==b[1]); } int move(int i){ if(i>2&&match(piles[i].top(),piles[i-3].top())){ piles[i-3].push(piles[i].top()); piles[i].pop(); if(piles[i].empty()) piles.erase(piles.begin()+i); return 4; } if(i>0&&match(piles[i].top(),piles[i-1].top())){ piles[i-1].push(piles[i].top()); piles[i].pop(); if(piles[i].empty()) piles.erase(piles.begin()+i); return 2; } return 0; } void solve(){ int k; for(int i=0;i<piles.size();i++){ k=move(i); if(k) i-=k; } return; } void print(){ ios::sync_with_stdio(false); cout<<piles.size(); cout<<(piles.size()==1?" pile remaining: ":" piles remaining: "); for(int i=0;i<piles.size();i++){ if(i) cout<<" "; cout<<piles[i].size(); } cout<<endl; piles.clear(); return; } int main(){ while(read()){ solve(); print(); } return 0; }
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **