Uva 127 "Accordian" Patience (模拟)

题意:

分析:

用栈去模拟牌堆, 写好两个移动的函数方便调用, 其实可以直接从右往左扫然后找到符合的, 然后按照题目进行即可。

 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 }
原文地址:https://www.cnblogs.com/Jadon97/p/7454169.html