結果

問題 No.460 裏表ちわーわ
コンテスト
ユーザー くれちー
提出日時 2016-12-11 02:06:03
言語 C90
(gcc 15.2.0)
コンパイル:
gcc-15 -O2 -std=c90 -DONLINE_JUDGE -o a.out _filename_ -lm
実行:
./a.out
結果
TLE  
実行時間 -
コード長 1,721 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 264 ms
コンパイル使用メモリ 40,832 KB
最終ジャッジ日時 2026-02-23 23:36:42
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 2 TLE * 1 -- * 25
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <stdio.h>
#include <math.h>

const int dx[9] = { -1,0,1,-1,0,1,-1,0,1 };
const int dy[9] = { -1,-1,-1,0,0,0,1,1,1 };

void turn(int b[9][9], int m, int n, int x, int y) {
	int i;
	for (i = 0; i < 9; i++) {
		if (x + dx[i] >= 0 && y + dy[i] >= 0)
			b[x + dx[i]][y + dy[i]] = !b[x + dx[i]][y + dy[i]];
	}
	return;
}

void turnall(int b[9][9], int m, int n, int a[9][9]) {
	int i, j;
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (a[i][j]) turn(b, m, n, i, j);
		}
	}
	return;
}

int cnton(int b[9][9], int m, int n) {
	int i, j, s = 0;
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			s += b[i][j];
		}
	}
	return s;
}

int check(int b[9][9], int m, int n) {
	int i, j;
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (b[i][j] != 0) return 0;
		}
	}
	return 1;
}

int getbit(int x, int n) {
	return !!(x & (int)pow(2, n - 1));
}

void copy(int b[9][9], int b2[9][9], int m, int n) {
	int i, j;
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			b2[i][j] = b[i][j];
		}
	}
	return;
}

void getbitmap(int b[9][9], int m, int n, int t) {
	int i, j, k, l, tmp[64];
	for (i = 0; i < m * n; i++) tmp[i] = getbit(t, i + 1);
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			b[i][j] = tmp[i * n + j];
		}
	}
	return;
}

int main() {
	int m, n;
	scanf("%d %d", &m, &n);

	int board[9][9];
	int i, j, k;
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			scanf("%d", &board[i][j]);
		}
	}

	int ans[9][9], board_[9][9];
	for (i = 0; i < pow(2, m * n); i++) {
		copy(board, board_, m, n);
		getbitmap(ans, m, n, i);
		turnall(board_, m, n, ans);
		if (check(board_, m, n)) {
			printf("%d\n", cnton(ans, m, n));
			return 0;
		}
	}
	puts("Impossible");
	return 0;
}
0