zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    超时时间已到。在操作完成之前超时时间已过或服务器未响应 shiney
    C#的映射机制 shiney
    C#用OLEDB导入问题总结 shiney
    SQL中的isnull shiney
    单虚拟机搭建zookeeper集群
    shell与sqlplus交互
    servlet
    迷你MVVM框架 avalonjs 入门教程
    classpath 'com.android.tools.build:gradle:6.7
    new ArrayList json.parse
  • 原文地址:https://www.cnblogs.com/Jadon97/p/7454169.html
Copyright © 2011-2022 走看看