アットウィキロゴ

全体公開 > 合同練習会 > 20130323 > E 戦艦ゲーム

問題の概要

二人のプレイヤーが, 自分の領域に, 戦艦を置いている.
各プレイヤーが座標を指定し, 相手がそこに戦艦をおいていれば撃破する.
置いていない場合, 又は, 相手の戦艦が無くなった場合は, 交代する.
速く相手の戦艦を消したほうが勝ちだが, 同じターン数で相手の戦艦を無くした場合, 又は, 両方残った場合は引き分けとする.
戦艦の位置と, 指定された座標が与えられるので, シミュレートし, どちらの勝ちか判定せよ.
但し, 勝敗の決した後も座標が与えられる可能性もある.

実装の方針, 注意点

+ ...
座標系に注意する.
とりあえず全部シミュレートし, クリアしたターンで比較して, 速い方が勝ちという事にする.
ターンは, プレイヤー交代毎に1増えるようにするが, クリアターンはそれを2で割り, 切り捨てたものとする.

ソースコード

+ ...
  1. bool solve(){
  2. int w, h, n;
  3. cin >> w >> h >> n;
  4.  
  5. vector<vector<string> > board(2, vector<string>(h));
  6. int rest[2] = {};
  7. rep(t, 2) rep(i, h) cin >> board[t][h-i-1];
  8. rep(t, 2) rep(i, h) rep(j, w) if(board[t][i][j] == '#')
  9. ++rest[t];
  10.  
  11. int t = 0, turn_num = 0;
  12. int end_turn[2] = {INF, INF};
  13. while(n--){
  14. int x, y;
  15. cin >> y >> x;
  16. if(board[!t][x][y] == '#'){
  17. board[!t][x][y] = '.';
  18. --rest[!t];
  19. if(rest[!t]) continue;
  20. end_turn[t] = turn_num/2;
  21. }
  22. ++turn_num;
  23. t ^= 1;
  24. }
  25. if(end_turn[0] == end_turn[1]){
  26. cout << "draw" << endl;
  27. }else if(end_turn[0] < end_turn[1]){
  28. cout << "player one wins" << endl;
  29. }else{
  30. cout << "player two wins" << endl;
  31. }
  32.  
  33. return true;
  34. }
  35.  



最終更新:2013年03月27日 00:18