偶数矩阵 Even Parity,UVa 11464
给你一个n*n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上、下、左、右的元素(如果存在的话)之和均为偶数。如图所示的矩阵至少要把3个0变成1,最终如图所示,才能保证其为偶数矩阵。

输入的第一行为数据组数T(T<30)。每组数据的第一行为正整数n(1 < n < 15);接下来的n行每行包含n个非0即1的整数,相邻整数间用一个空格隔开。
输出格式:
对于每组数据,输出被改变的元素的最小个数。如果无解,应输出-1。
0 0 0
1 0 0
0 0 0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
const int MAXN=;
const int INF=;
int A[MAXN][MAXN],B[MAXN][MAXN];
int n;
int min(int a,int b)
{
return a>b?b:a;
}
int check(int s)
{
memset(B,,sizeof(int));
for(int c=;c<n;c++)//枚举第一行
{
if(s&(<<c)) B[][c]=;
else if(A[][c]==) return INF;//不能把1变成0,直接返回
}
for(int r=;r<n;r++)//从第二行开始依次筛查
{
for(int c=;c<n;c++)
{
int sum=;//表示上左右三个元素的和
if(r>) sum+=B[r-][c];
if(c>) sum+=B[r-][c-];
if(c<n-) sum+=B[r-][c+];
B[r][c]=sum%;
if(A[r][c]==&&B[r][c]==) return INF;//违法,不能把1变为0
}
}
int cnt=;
for(int r=;r<n;r++)
{
for(int c=;c<n;c++)
{
if(A[r][c]!=B[r][c]) cnt++;
}
}
return cnt;
}
int main()
{
int r,c;//行、列
int i,j;
int T;
int ans=INF;//初始化为最大值
scanf("%d",&T);
while(T)
{
ans=INF;
scanf("%d",&n);
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
scanf("%d",&A[i][j]);
}
}
for(int s=;s<(<<n);s++)//1<<n等于2^n,不用pow,比较方便
{
ans=min(ans,check(s));//不断更新最小ans
}
if(ans==INF) ans=-;//没找到答案
printf("%d %d\n",T,ans);
T--;
}
return ;
}
偶数矩阵 Even Parity,UVa 11464的更多相关文章
- Java实现偶数矩阵(Even Parity, UVa 11464)
偶数矩阵(Even Parity, UVa 11464) 问题描述 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1, 使得每个元素的上.下.左.右的元素(如果存在的话)之和 ...
- Even Parity UVA - 11464 (枚举)
从来没有觉得枚举有多费脑子的.但是这道题还是很香的. 思路:就是非常简单的枚举啦. 从一般的枚举开始考虑.一般的做法就是在所有的格子中有两种状态1, 0. 而一共有225个格子,所有一共要枚举的情 ...
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...
- UVA 11464 偶数矩阵
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA.11464 Even Parity (思维题 开关问题)
UVA.11464 Even Parity (思维题 开关问题) 题目大意 给出一个n*n的01方格,现在要求将其中的一些0转换为1,使得每个方格的上下左右格子的数字和为偶数(如果存在的话),求使得最 ...
- 状态压缩+枚举 UVA 11464 Even Parity
题目传送门 /* 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 状态压缩+枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 ...
- UVA 11464 Even Parity(部分枚举 递推)
Even Parity We have a grid of size N x N. Each cell of the grid initially contains a zero(0) or a on ...
- UVa 11464 - Even Parity
解题报告:题目大意有一个N×N的矩阵,矩阵中的元素只有1或0,如果说对于一个矩阵,它的所有的点的上下左右的点的和是偶数,则称这个矩阵为偶数矩阵,现在给你一个任意的矩阵,要求的是如果要把这个矩阵变成偶数 ...
- 【转载】UVa 11464 Even Parity 偶数矩阵
题意:给你一个n*n的01矩阵,让你把这个矩阵中尽量少的0转换成1,使得矩阵每个位置的上下左右四个相邻的数加起来能被2整除,求最少的转换数 首先,n 的规模并不大,最大只有15.但是完全枚举整个矩阵显 ...
随机推荐
- 免费s账号网站
下面网址按排序顺序优先使用,数字越小优先级越高 1,https://io.freess.today/ 2,https://free-ss.site/ 3,https://ss.freess.org/ ...
- TP5 分页数据加锚点
TP5 分页数据加锚点跳转到相应位置 有这样一个需求,就是加载评论后,点下一页的时候回到相应的位置. $comment = Db('comment')->order('addtime' ...
- SHELL/VIM删除重复行(去重)text handle
vim 删除重复行 - 国内版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=vim+%E5%88%A0%E9%99%A4% ...
- leetcode 611. Valid Triangle Number 、259. 3Sum Smaller(lintcode 918. 3Sum Smaller)
这两个题几乎一样,只是说611. Valid Triangle Number满足大于条件,259. 3Sum Smaller满足小于条件,两者都是先排序,然后用双指针的方式. 611. Valid T ...
- Dart中的类型转换总结:
1.Dart中数组转换为字符串:join var a=[1,2,3,4]; var str=a.join(',');
- Flutter中的Stack、Align、Positioned的使用
import 'package:flutter/material.dart'; import 'package:flutter_testdemo001/res/listData.dart'; void ...
- ES6深入浅出-3 三个点运算 & 新版字符串-2. 新版字符串
这是以前的字符串..双引号,单引号.毫无区别 有时候在字符串里面写一些标签. 排版不好看 我就想回车一下.这样写虽然是好看.但是语法就报错了.es5的字符串不支持换行.我只想是想让它排版的好看一点. ...
- 123457123456#0#----com.DoraGame.ErTongFanPai97--前拼后广--记忆翻牌-doraX
com.DoraGame.ErTongFanPai97--前拼后广--记忆翻牌-doraX
- FreeMarker的应用场景
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一 ...
- realloc(void *__ptr, size_t __size)
#include <stdlib.h>realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小.如果 ...