UVa 170 - Clock Patience

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=3&problem=106&mosmsg=Submission+received+with+ID+7876381

問題概要

Clock Patience という遊びの結果を計算せよ。

コード

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>

#define MAX 13

class card{
public:
  bool face_up;
  int v;
  char suit;
  card():face_up(false),v(0),suit('X'){}
  card(bool face_up, int v, char suit):
    face_up(face_up),v(v),suit(suit){}
};

int conv(char c){
  int ret=0;
  switch(c){
  case 'T':ret=10;break;
  case 'J':ret=11;break;
  case 'Q':ret=12;break;
  case 'K':ret=13;break;
  case 'A':ret= 1;break;
  default: ret=c-'0';break;
  }
  return ret;
}

char rev(int v){
  char ret='X';
  switch(v){
  case 1:ret='A';break;
  case 10:ret='T';break;
  case 11:ret='J';break;
  case 12:ret='Q';break;
  case 13:ret='K';break;
  default:ret=v+'0';break;
  }
  return ret;
}

using namespace std;

int main(){
  while(true){
    int exposed=0;
    vector<card> clock[MAX];
    vector<string> pile;
    int face_downs[MAX];

    for(int i = 0; i < 4*MAX; ++i){
      string s;
      cin >> s;
      if(s=="#")return 0;
      pile.push_back(s);
    }

    reverse(pile.begin(),pile.end());

    for(int i = pile.size() - 1; i >= 0; --i){
      string s = pile[i];
      clock[i%MAX].push_back( card(false,conv(s[0]),s[1]) );
    }

    for(int i = 0; i < MAX; ++i){
      face_downs[i]=4;
      reverse( clock[i].begin(), clock[i].end() );
    }

    /*
      for(int i = 0; i < MAX; ++i){
      cout<<i+1<<" : ";
      for(int j = 0; j < 4; ++j){
	cout<<clock[i][j].v<<clock[i][j].suit<<' ';
      }
      cout<<endl;
      }
    */

    int cur=12;
    string last_card;
    while(true){
      vector<card> &v = clock[cur];
      if( face_downs[cur] == 0 )
	break;
      card c = v.back();
      last_card=rev(c.v);
      last_card+=c.suit;
      v.pop_back();
      ++exposed;
      --face_downs[cur];
      c.face_up=true;
      clock[c.v-1].insert( clock[c.v-1].begin(), c);
      cur=c.v-1;
    }
    printf("%02d,%c%c\n", exposed, last_card[0], last_card[1]);
  }
  return 0;
}

コード概要

問題どおりに実装する。とある先輩のコードとほとんど同じ。