シミュレーション問題ural 1784.Rounders

1948 ワード

タイトルリンク:
http://acm.timus.ru/problem.aspx?space=1&num=1784
タイトル:
1枚のカードは4つの山に分けられ、1つの山ごとに13枚のカードがあり、1つの山の値は前から後まで2-KAで、カードの色が異なる可能性があります.
2つの操作が可能になりました.1.同じ色のk枚を山の中から持ち、新しい山を構成します.
2、山の中から同じ色のk枚を、現在の山の上に置く.現在の山の最初のカードの値は、山の底の値より1つ大きいことが要求される.
少なくともどれだけのステップで操作する必要があるかを聞いて、カードの山ごとに色が同じになります.
問題解決の考え方:
模擬問題+欲張り思想.各列について、カードの値は必ず同じで、色はそれぞれ違います.
最後の列を基準にして、最後から2番目の列から前に進みます.前の列に2つ後ろの列の色が違う場合は、3回移動します.
3つの違いがある場合は4回移動し、4つの違いがある場合は2つの場合、ちょうど2つのペアが互いに異なる場合は6回移動し、4つの混合が異なる場合は5回移動することに注意してください.
コード:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF (1<<30)
#define PI acos(-1.0)
using namespace std;

char save[5][14][5];

int main()
{
   while(scanf("%s",save[1][1])!=EOF)
   {
      for(int i=1;i<=4;i++)
      {
         for(int j=1;j<=13;j++)
         {
            if(i==1&&j==1)
               continue;
            scanf("%s",save[i][j]);
         }
      }
      int ans=0;
      for(int i=12;i>=1;i--)
      {
         int cnt=0;
         for(int j=1;j<=4;j++)
            if(save[j][i][1]!=save[j][i+1][1])
               cnt++;
         if(cnt==0)
            continue;
         if(cnt<=3)
            ans+=cnt+1;
         else if(cnt==4) //          ,     ,         
         {               //            ,          
            ans+=cnt+1;
            int j=2;
            for(j=2;j<=4;j++)
               if(save[1][i][1]==save[j][i+1][1])
                  break;
            if(save[j][i][1]==save[1][i+1][1])
               ans++;
         }
      }
      printf("%d
",ans); } return 0; }