概要
のグリッド状にボタンが並んでいます。
あるボタンを押すと、そのボタン及びその四近傍のボタンの状態 ( ON | OFF ) が切り替わります。
それぞれのボタンを押した回数が与えられるので、操作が完了したあとのボタンの状態を全て求めよ。
解法
各ボタンについて、切り替えられた回数をシミュレーションで求め、最後に MOD 2 をとることで状態が分かります。
コード
typedef vector<int> VI; typedef vector<VI> VVI; #define REP( i, m, n ) for ( int i = (int)( m ); i < (int)( n ); ++i ) #define FOR( v, c ) for ( auto &v : c ) const int dir[][2] = { 0, 0, 1, 0, 0, 1, -1, 0, 0, -1 }; int main() { cin.tie( 0 ); ios::sync_with_stdio( false ); VVI board( 3, VI( 3 ) ); FOR( line, board ) { FOR( a, line ) { cin >> a; } } VVI res( 3, VI( 3, 1 ) ); REP( i, 0, 3 ) { REP( j, 0, 3 ) { REP( d, 0, 5 ) { int di = i + dir[d][0], dj = j + dir[d][1]; if ( !( 0 <= di && di < 3 && 0 <= dj && dj < 3 ) ) { continue; } res[ di ][ dj ] += board[i][j]; } } } FOR( line, res ) { FOR( a, line ) { cout << a % 2; } cout << endl; } return 0; }