UVa 170 - Clock Patience
問題概要
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; }
コード概要
問題どおりに実装する。とある先輩のコードとほとんど同じ。