题目大意:给出一个n*n的01矩阵,你的任务是把尽量少的0变成1,使得每个元素的上下左右的元素之和均为偶数
解题思路:枚举第一行的所有状态,再进行统计
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 25
int begin[maxn][maxn], end[maxn][maxn];
int N;
int count(int S) {
memset(end,0,sizeof(end));
for(int i = 0; i < N; i++)
if(S & (1 << i))
end[0][i] = 1;
else if(end[0][i] == 0 && begin[0][i] == 1)
return INF;
for(int row = 1; row < N; row++)
for(int col = 0; col < N; col++) {
int sum = 0;
if(row > 1) sum += end[row-2][col];
if(col >= 1) sum += end[row-1][col-1];
if(col < N -1) sum += end[row-1][col+1];
end[row][col] = sum % 2;
if(begin[row][col] == 1 && end[row][col] == 0)
return INF;
}
int cnt = 0;
for(int row = 0; row < N; row++)
for(int col = 0; col < N; col++)
if(begin[row][col] != end[row][col])
cnt++;
return cnt;
}
int main() {
int test, mark = 1;
scanf("%d",&test);
while(test--) {
scanf("%d",&N);
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
scanf("%d",&begin[i][j]);
int MIN = INF;
for(int i = 0; i < (1 << N); i++)
MIN = min(MIN,count(i));
if(MIN == INF)
MIN = -1;
printf("Case %d: %d\n",mark++, MIN);
}
return 0;
}