90分模拟求调,第五个点wa
查看原帖
90分模拟求调,第五个点wa
762199
fulichang楼主2023/8/15 20:18
#include <iostream>
#include <cmath>

const int N = 20;
int n, ans = 1145141919;
int sz[N][N], pic[N][N];

void in () {
	scanf ("%d", &n);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			scanf ("%d", &sz[i][j]);
}

int main () {
	in();
	if (n == 1 && pic[1][1]) {
		puts("0");
		return 0;
	}
	for (int a = 1; a < std::pow(2, n);  a++) {
		for (int i = 2; i <= n; i++)
			for (int j = 1; j <= n; j++)
				pic[i][j] = sz[i][j];
		int t = n;
		pic[1][n]++;
		while (pic[1][t] >= 2 && t) {
			pic[1][t] = 0;
			pic[1][--t]++;
		}
		for (int i = 1; i < n; i++)
			for (int j = 1; j <= n; j++)
				if ((pic[i - 1][j] + pic[i][j - 1] + pic[i][j + 1]) % 2)
					pic[i + 1][j] = 1;
		int num = 0, f = 0;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++) {
				if (!sz[i][j] && pic[i][j])
					num++;
				if ((pic[i - 1][j] + pic[i + 1][j] + pic[i][j - 1] + pic[i][j + 1]) % 2 || sz[i][j] && !pic[i][j]) {
					f = 1;
					break;
				}
			}
		if (!f)
			ans = std::min(ans, num);
	}
	printf ("%d\n", ans);
	return 0;
}
2023/8/15 20:18
加载中...