KUPC2012 H : 植林

問題概要

H*W(H,W<1000, H,W:even)の盤面で変則ライツアウトを行う。ルールは選んだマスの同じ行、列をフリップする。最小手数の盤面を出力する。

解法

よく理解できていない…。各マスについて、自マスを含む同じ行、列についてxorをとったものを反転したものが答えになっている。パリティ符号みたいなもの?

acceptされたコード

#include <cstdio>
using namespace std;

const int MAX_N = 1000;

int H, W;
int ys[MAX_N], xs[MAX_N];
int orig[MAX_N][MAX_N];
int ans[MAX_N][MAX_N];
void init() {
	scanf("%d%d", &H, &W);
	for (int i = 0; i < H; ++i) {
		for (int j = 0; j < W; ++j) {
			scanf("%d", orig[i] + j);
			ys[i] ^= orig[i][j];
			xs[j] ^= orig[i][j];
		}
	}

}

void solve() {
	for (int i = 0; i < H; ++i) {
		for (int j = 0; j < W; ++j) {
			printf("%d%c", 1 ^ orig[i][j] ^ ys[i] ^ xs[j], j == W-1 ? '\n': ' ');
		}
	}
}

int main() {
	init();
	solve();

	return 0;
}