Problem 2024 : Blackjack

Problem A: Blackjack
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=2024

  • 問題概要

ブラックジャックのシミュレーション
カードの山とどういうときカードを引くかの条件が与えられている。
最終スコアを出力せよ。

  • 解法

書くだけ。

  • ソース
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<sstream>
#include<cassert>
#include<queue>
#include<stack>

#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define pb         push_back
#define mp         make_pair
#define vint       vector<int>
#define FOR(it,o)  for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it)
#define lli	    long long int
#define ld	    long double

using namespace std;


main(){

  map<char, int> index;
  REP(i, 2, 10){
    index[(char)i + '0'] = i;
  }
  index['T'] = index['J'] = index['Q'] = index['K'] = 10;
  index['A'] = 1;
  int n;
  cin >> n;
  
  rep(i, n){
    int score = 0;
    bool ace = false;
    rep(j, 2){
      char tmp;
      cin >> tmp;
      if(ace ||tmp != 'A')score += index[tmp];
      else ace = true;
    }
    char card[8];
    rep(j, 8)cin >> card[j];
    bool bj = true;
    rep(j, 8){
      int tmp = score;
      bool flag = false;
      if(ace){
	if(tmp <= 10){
	  tmp += 11;
	  flag = true;
	}
	else {
	  tmp++;
	}
      }
      if(flag && tmp == 17){  
	bj = false;
	score += index[card[j]];
      }
      else if(tmp <= 16){ 
	bj = false;
	if(card[j] == 'A' && !ace){
	  ace = true;
	}
	else score += index[card[j]];
      }
      else break;
    }
    if(ace){
      if(score <= 10){
	score += 11;
      }
      else score++;
    }
    if(bj && score == 21)cout << "blackjack" << endl;
    else if(score > 21)cout << "bust" << endl;
    else cout << score << endl;
  }
}