AOJ : 2024 - Blackjack

問題概要

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=2024
ブラックジャックやって, 最終的な得点を出す問題.
詳しくは, 次のルール

  • 2~10はそのままの点数
  • J,Q,Kは10点
  • Aは21超えないときは, 11点として数えて, 21点超えたときは, 1点として数える
  • 開始直後, 21点を取ったら, blackjackと出力
  • 途中で, 21点を超したら, bustと出力

アルゴリズム

やるだけです.

プログラム

int p;
bool aceFlg; //エースが11としてカウントされてるフラグ
bool printFlg;
char card[128];

void add(char ch){
  if(ch == 'A'){
    if(p+11 <= 21){
      p += 11;
      aceFlg = true;
    }else{
      p++;
    }
  } else{
    p += card[ch];
  }
}

int main(void){
  for(int i=2;i<10;i++) card['0'+i] = i;
  card['T'] = card['J'] = card['Q'] = card['K'] = 10;

  int n;
  cin>>n;

  while(n--){
    p = aceFlg = 0;
    printFlg = true;
    char a,b;
    cin>>a>>b;

    add(a);
    add(b);
    if(p == 21){
      cout<<"blackjack\n";
      printFlg = false;
    }

    for(int i=0;i<8;i++){
      char ch;
      cin>>ch;
      if(!printFlg) continue;

      if(p <= 16 || p == 17 && aceFlg){
        add(ch);
        if(p > 21 && aceFlg){
          p -= 10;
          aceFlg = false;
        }
        if(p > 21){
          cout<<"bust\n";
          printFlg = false;
        }
      }
    }

    if(printFlg){
      cout<<p<<endl;
    }
  }

  return 0;
}