题意:
分析:
用栈去模拟牌堆, 写好两个移动的函数方便调用, 其实可以直接从右往左扫然后找到符合的, 然后按照题目进行即可。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 53; 4 struct C{ 5 int s, r; 6 C(int _s, int _r): s(_s), r(_r){} 7 }; 8 stack<C> card[maxn]; 9 10 string str1,str2; 11 12 int cnt = 0, last = 52; 13 14 void mov(int index){ 15 for(int i = index; i < last - 1; i++){ 16 card[i] = card[i+1]; 17 } 18 last--; 19 } 20 21 void pair1(int i){ 22 card[i].push(card[i+1].top()); 23 card[i+1].pop(); 24 if(card[i+1].empty()){ 25 mov(i+1); 26 } 27 } 28 29 void pair3(int i){ 30 card[i].push(card[i+3].top()); 31 card[i+3].pop(); 32 33 if(card[i+3].empty()){ 34 mov(i+3); 35 } 36 } 37 38 int main(){ 39 ios::sync_with_stdio(false); 40 while(cin >> str1 && str1[0] != '#'){ 41 42 stringstream ss(str1); 43 44 while(ss >> str1){ 45 card[cnt++].push(C(str1[1], str1[0])); 46 } 47 if(cnt == 52){ 48 for(;;){ 49 50 int ok = 0; 51 52 for(int i = 0; i < last; i++){//我这里是从左往右扫符合移动的牌堆。 如果找到+3的,那么需要找他下一个+1是否符合,符合则移动它下一个+1而不是它的+3,其他情况直接移动 53 54 if(i + 1 < last && (card[i].top().s == card[i+1].top().s || card[i].top().r == card[i+1].top().r)){ 55 56 pair1(i); 57 ok = 1; 58 break; 59 60 } 61 if(i + 3 < last && (card[i].top().s == card[i+3].top().s || card[i].top().r == card[i+3].top().r)){ 62 63 if(card[i+1].top().s == card[i+2].top().s || card[i+1].top().r == card[i+2].top().r){ 64 pair1(i+1); 65 } 66 else pair3(i); 67 68 ok = 1; 69 break; 70 71 } 72 } 73 74 if(!ok) break; 75 76 } 77 78 if(last == 1) 79 cout << last<<" pile remaining:"; 80 else 81 cout << last <<" piles remaining:"; 82 83 84 for(int i = 0; i < last; i++){ 85 cout << " " << card[i].size(); 86 } 87 cout << " "; 88 89 cnt = 0, last = 52; 90 for(int i = 0; i < last; i++){ 91 while(!card[i].empty()) 92 { 93 card[i].pop(); 94 } 95 } 96 } 97 } 98 }