AOJ : 2175 - Whist

問題概要

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=2175
ホイスト(http://www.page.sannet.ne.jp/mikotan/cardgame/heist.html)というカードゲームのシミュレーション問題.
ただし, 得点計算は, 勝利数-6になるので注意.

アルゴリズム

実装するだけです.
文章問題なので, 問題が読解できさえすれば簡単です.
僕は, 問題読解に非常に時間がかかりました・・・.

プログラム

int rank[128];
char trump;
string card[4][13];

int main(void){
  for(int i=2;i<10;i++) rank['0'+i] = i;
  rank['T'] = 10;
  rank['J'] = 11;
  rank['Q'] = 12;
  rank['K'] = 13;
  rank['A'] = 14;

  while(cin>>trump,trump!='#'){
    for(int i=0;i<4;i++){
      for(int j=0;j<13;j++){
        cin>>card[i][j];
      }
    }

    int first = 0; //各ターンで一番最初にカードを出す人
    int win[] = {0,0};

    for(int i=0;i<13;i++){
      int winner = 0, max = 0;
      bool flg = false; //trumpが出たかのフラグ
      char led = card[first][i][1]; //最初に出した人のスート

      for(int j=0;j<4;j++){
        int r = rank[card[j][i][0]];
        char s = card[j][i][1];

        if(flg){
          if(s == trump && r > max){
            max = r;
            winner = j;
          }
        }
        else{
          if(s == trump){
            flg = true;
            max = r;
            winner = j;
          }
          else if(s == led && r > max){
            max = r;
            winner = j;
          }
        }
      }

      first = winner;
      win[winner%2]++;
    }

    if(win[0] > win[1])
      cout<<"NS "<<win[0]-6<<endl;
    else
      cout<<"EW "<<win[1]-6<<endl;
  }

  return 0;
}