ぱーぽーの競プロ記

競技プログラミングに関することを書きます。

AOJ 2175 Whist

・概要
問題文はこちら
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2175

トランプのホイストというゲームのシュミレーション問題です。

ホイストのルールはこちらを参考に
http://ja.wikipedia.org/wiki/%E3%83%9B%E3%82%A4%E3%82%B9%E3%83%88
(カードの強さは逆順になってる?)


・解法
ホイストのルールに従ってシミュレーションしていけばよいです。

私はルールを理解するのに時間がかかってしまい、だいぶタイムロスに…。


ソースコード

#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
#include<complex>
#include<sstream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<cstring>
#include<cassert>
using namespace std;
 
#define REP(i,x,n) for(int i = x ; i < (int)(n) ; i++)
#define rep(i,n) REP(i, 0, n)
#define f first
#define s second
#define mp make_pair
#define pb push_back
 
typedef pair<int,int> P;
typedef long long ll;
 
static const int INF = (1<<29);
static const double EPS = 1e-9;
static const double PI = acos(-1.0);
 
// parent: 0=N, 1=E, 2=S, 3=W 
 
int main(){
  map<char,int> num;
  num['T'] = 10;
  num['J'] = 11;
  num['Q'] = 12;
  num['K'] = 13;
  num['A'] = 1;
  char trump;
  string card[4][13];
   
  while(cin >> trump){
    if(trump=='#') break;
    rep(i,4) rep(j,13) cin >> card[i][j];
    int parent,ew,ns;
    parent = ew = ns = 0;
    rep(i,13){
      char tmp = card[parent][i][0];
      int rank = isdigit(tmp) ? (int)(tmp - '0') : num[tmp];
      char suit = card[parent][i][1];
      bool tFlag = (trump==suit) ? true : false;
      rep(j,4){
        if(parent==j) continue;
        if(trump==card[j][i][1]){
          if(!tFlag){
            tFlag = true;
            suit = trump;
            parent = j;
            tmp = card[j][i][0];
            rank = isdigit(tmp) ? (int)(tmp - '0') : num[tmp];
          }
          else{
            tmp = card[j][i][0];
            int val = isdigit(tmp) ? (int)(tmp - '0') : num[tmp];
            if(rank!=1 && (rank < val || val==1)){
              parent = j;
              rank = val;
            }
          }
        }
        else if(suit==card[j][i][1]){
          tmp = card[j][i][0];
          int val = isdigit(tmp) ? (int)(tmp - '0') : num[tmp];
          if(rank!=1 && (rank < val || val==1)){
            parent = j;
            rank = val;
          }
        }
      }
      //cout << i << " " << parent << endl;
      if(parent%2!=0) ew++;
      else            ns++;
    }
     
    if(ew > ns) cout << "EW " << ew - 6 << endl;
    else        cout << "NS " << ns - 6 << endl;
  }
  return 0;
}