問題の概要
二人のプレイヤーが, 自分の領域に, 戦艦を置いている.
各プレイヤーが座標を指定し, 相手がそこに戦艦をおいていれば撃破する.
置いていない場合, 又は, 相手の戦艦が無くなった場合は, 交代する.
速く相手の戦艦を消したほうが勝ちだが, 同じターン数で相手の戦艦を無くした場合, 又は, 両方残った場合は引き分けとする.
戦艦の位置と, 指定された座標が与えられるので, シミュレートし, どちらの勝ちか判定せよ.
但し, 勝敗の決した後も座標が与えられる可能性もある.
実装の方針, 注意点
|
+
|
... |
座標系に注意する.
とりあえず全部シミュレートし, クリアしたターンで比較して, 速い方が勝ちという事にする.
ターンは, プレイヤー交代毎に1増えるようにするが, クリアターンはそれを2で割り, 切り捨てたものとする.
|
ソースコード
|
+
|
... |
bool solve(){ int w, h, n; cin >> w >> h >> n; vector<vector<string> > board(2, vector<string>(h)); int rest[2] = {}; rep(t, 2) rep(i, h) cin >> board[t][h-i-1]; rep(t, 2) rep(i, h) rep(j, w) if(board[t][i][j] == '#') ++rest[t]; int t = 0, turn_num = 0; int end_turn[2] = {INF, INF}; while(n--){ int x, y; cin >> y >> x; if(board[!t][x][y] == '#'){ board[!t][x][y] = '.'; --rest[!t]; if(rest[!t]) continue; end_turn[t] = turn_num/2; } ++turn_num; t ^= 1; } if(end_turn[0] == end_turn[1]){ cout << "draw" << endl; }else if(end_turn[0] < end_turn[1]){ cout << "player one wins" << endl; }else{ cout << "player two wins" << endl; } return true; }
|
最終更新:2013年03月27日 00:18