0
点赞
收藏
分享

微信扫一扫

UVA11464偶数矩阵

题意:
      给你一个n*n的01矩阵,你的你的任务是吧尽量少的0变成1,使得每个元素的上下左右之和均为偶数(如果有的话),比如
0 0 0         0 1 0
1 0 0  --->   1 0 1   
0 0 0         0 1 0
是变换了3个。


思路:
      这个题目拿到手的最暴力的反应就是直接搜索枚举所有,那么时间复杂度是
O(2^(15*15))直接就跪了,其实这个题目有个很关键的突破口,就是只要第一行确定了,那么其他的都是确定的,这个可以自己找几个矩阵试验下,所以我们可以直接深搜去枚举第一行,然后根据第一行吧所有的都填充完,看看有没有冲突,如果没有就更新答案的最优值,这样的时间复杂度是O(2^15*15*15) = O(32768 * 225)没啥大压力。


#include<stdio.h>



int map[16][16] ,now[16][16];

int Ans ,n;



void DFS(int noww)

{

if(noww == n + 1)

{

int tmp = 0;

for(int i = 1 ;i <= n ;i ++)

if(!map[1][i] && now[1][i]) tmp ++;

for(int i = 2 ;i <= n ;i ++)

for(int j = 1 ;j <= n ;j ++)

{

int ss = 0 ,nowi = i - 1 ,nowj = j;

if(nowi >= 2) ss += now[nowi-1][j];

if(nowj >= 2) ss += now[nowi][j-1];

if(nowj <= n-1) ss += now[nowi][j+1];

now[i][j] = ss % 2;

if(!map[i][j] && now[i][j]) tmp ++;

if(map[i][j] && !now[i][j]) return;

}

if(Ans == -1 || Ans > tmp) Ans = tmp;

return;

}



now[1][noww] = 1;

DFS(noww+1);

if(!map[1][noww])

{

now[1][noww] = 0;

DFS(noww+1);

}

}



int main ()

{

int i ,j ,t ,cas = 1;

scanf("%d" ,&t);

while(t--)

{

scanf("%d" ,&n);

for(i = 1 ;i <= n ;i ++)

for(j = 1 ;j <= n ;j ++)

scanf("%d" ,&map[i][j]);

Ans = -1;

DFS(1);

printf("Case %d: %d\n" ,cas ++ ,Ans);

}

return 0;

}

举报

相关推荐

0 条评论