uva 11464

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int T;
int N;

const int maxn = 20;

const int ans = 1000000000;


int A[maxn][maxn], B[maxn][maxn];


int check(int i){
	memset(B, 0, sizeof(B));
	for(int c = 0; c < N; c++)
		if( i & ( 1 << c)){
			B[0][c] = 1;
		}else{
			if( A[0][c] == 1){
				return ans;	
			}
		}
	for(int r = 0; r < N - 1; r++ )
		for(int c = 0; c < N; c++){
			int sum = 0;
						
					/*up -> left -> right -> get below*/	
		if(r != 0){
			sum += B[r - 1][c];
		}
		if(c != 0){
			sum += B[r][c - 1];
		}
		if(c != N -1){
			sum += B[r][c + 1];
		}

		int below = sum%2;

		if(below == 0 && A[r + 1][c] == 1){
			return ans;
		}
		B[r + 1][c] = below;
	}

	int ret = 0;
	for(int r = 0; r != N; r++)
		for(int c = 0; c != N; c++){
			if( A[r][c] != B[r][c])
				++ret;
	}
	return ret;

}


int main()
{
	scanf("%d", &T);
	for(int i = 0; i < T; i++){
		scanf("%d", &N);
		for(int r = 0; r < N; r++)
			for(int c = 0; c < N; c++){
				scanf("%d", &A[r][c]);	
		}
		
		int ret = ans;

		for(int j = 0; j < (1<<N); j++){
			ret = min(ret , check(j));	/*get smallest */
		}
		if(ret == ans) ret = -1;
		printf("Case %d: %d\n", i + 1, ret);
	}

return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值