torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

Codeforces #168, Division 2, A : Lights Out

概要

3 \times 3 のグリッド状にボタンが並んでいます。
あるボタンを押すと、そのボタン及びその四近傍のボタンの状態 ( 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;
}