Golden Week Contest 2015 C Snukeと対戦!

2015/05/05 (Tue) AtCoder ゲーム 対称性

問題

問題文

方針

マスの数 $HW$ が偶数なら後攻を選び、相手が置いたのと対称の位置に逆の色を置いていく。 奇数の場合は先攻を選び、中心に置いてから場所は同じようにして同じ色を置いていく。 対称の位置には必ず置くことができるので終了ターンは必ず奇数番目のターンになり勝てる。

ゲームで DP でも Nim でもないときは対称性をうまく使うのが大事そう。

実装

int H,W;
int a,b,c;
 
void even(){
    cout << "Second" << endl;
    while (cin >> a >> b >> c && a!=-1) {
        cout << H-a+1 << " " << W-b+1 << " " << 1-c << endl;
    }
}
 
void odd(){
    cout << "First" << endl;
    cout << H / 2+1 << " " << W / 2+1 << " 1" << endl;
    while (cin >> a >> b >> c && a!=-1) {
        cout << H-a+1 << " " << W-b+1 << " " << c << endl;
    }
}
 
signed main(){
    cin >> H >> W;
    if(H*W%2==0) even();
    else odd();
}