题意

给出一个 01 二维方阵

可以将里面的 0 改成1 但是 不能够 将 1 改成 0

然后这个方阵 会对应另外一个 方阵 另外一个方阵当中的元素 为 上 下 左 右 四个元素(如果存在)的和 要求另外一个方阵当中的元素 全都是偶数

求 最少的 改变次数 使得 满足这种状态

思路

刚开始 想要暴力枚举 所有状态

但是 2^225 太大了。。。

后来想想 如果 第一行确定了 那么 接下来的每一行 都是能够确定的

比如说

3

0 0 0

1 0 0

0 0 0

这组 样例 来说

假如 我第一行为

0 1 0

那么 第二行的状态

如果 原始元素 为 1 我们就要判断 是否满足 不满足 就return

如果 原始元素 为 0 我们就判断 其 左上 右上 和 上上 的元素 相加 是否为 奇数 如果是 ans++ 并且 将该元素 改为 1

然后 最后 其实是要多判断一行的

因为我们每一次判断的 其实是上一行的状态 比如说

当前的状态是 g[5][5] 那么 我们就要求

sum = g[4][4] + g[4][6] + g[3][5] 易知 这三个点 都是已经 判断并且更新过的

如果 sum 为 奇数

并且 g[5][5] = 0 的话 我们就将 g[5][5] 改为1 ans++

因为只有这样 g[4][5] 这个点 的sum 才是偶数

如果 g[5][5] = 1 那么 这种状态就是不行的 直接 return 一个不行的标记的就可

AC代码

#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits> #define CLR(a, b) memset(a, (b), sizeof(a))
#define pb push_back using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss; const double PI = acos(-1.0);
const double E = exp(1.0);
const double eps = 1e-30; const int INF = 0x3f3f3f3f;
const int maxn = 4e5 + 5;
const int MOD = 1e9 + 7; int G[15][15];
int n; int Move[4][2]
{
0, 0,
-1, -1,
-1, 1,
-2, 0,
}; bool ok(int x, int y)
{
if (x < 0 || x >= n || y < 0 || y >= n)
return false;
return true;
} int check(int cur)
{
int g[16][16];
CLR(g, 0);
int ans = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
g[i][j] = G[i][j];
}
}
for (int i = n - 1; i >= 0; i--)
{
if (g[0][i] == 0)
{
if (cur & 1)
{
ans++;
g[0][i] = 1;
}
cur >>= 1;
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < n; j++)
{
int sum = 0;
for (int k = 0; k < 4; k++)
{
int x = i + Move[k][0];
int y = j + Move[k][1];
if (ok(x, y))
sum += g[x][y];
}
if (sum & 1)
{
if (g[i][j] == 0)
{
g[i][j] = 1;
ans++;
}
else
{
return INF;
}
}
}
}
return ans;
} int main()
{
int t;
cin >> t;
int count = 1;
while (t--)
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &G[i][j]);
int ans = INF;
int len = 0;
for (int i = 0; i < n; i++)
{
if (G[0][i] == 0)
len++;
}
len = 1 << len;
for (int i = 0; i <= len; i++)
ans = min(check(i),ans);
printf("Case %d: ", count++);
if (ans == INF)
printf("-1\n");
else
cout << ans << endl;
}
}

UVA - 11464 Even Parity 【暴力枚举】的更多相关文章

  1. 状态压缩+枚举 UVA 11464 Even Parity

    题目传送门 /* 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 状态压缩+枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 ...

  2. UVA.11464 Even Parity (思维题 开关问题)

    UVA.11464 Even Parity (思维题 开关问题) 题目大意 给出一个n*n的01方格,现在要求将其中的一些0转换为1,使得每个方格的上下左右格子的数字和为偶数(如果存在的话),求使得最 ...

  3. UVA.12716 GCD XOR (暴力枚举 数论GCD)

    UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...

  4. UVA 11464 Even Parity(递归枚举)

    11464 - Even Parity Time limit: 3.000 seconds We have a grid of size N x N. Each cell of the grid in ...

  5. 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 ...

  6. UVa 11464 Even Parity (二进制法枚举)

    题意:给你一个n*n的01矩阵,让你把最少的0变成1,使得每个元素的上,下,左,右的元素(如果有的话)之和均为偶数. 析:最好想的的办法就是暴力,就是枚举每个数字是变还是不变,但是...时间复杂度也太 ...

  7. UVA 11464 - Even Parity(枚举方法)

    D Even Parity Input: Standard Input Output: Standard Output We have a grid of size N x N. Each cell ...

  8. 【UVA】11464 Even Parity(枚举子集)

    题目 传送门:QWQ 分析 标准的套路题. 枚举第一行,接着根据第一行递推下面的行. 时间复杂度$ O(2^n \times n^2) $ 代码 #include <bits/stdc++.h& ...

  9. 【转载】UVa 11464 Even Parity 偶数矩阵

    题意:给你一个n*n的01矩阵,让你把这个矩阵中尽量少的0转换成1,使得矩阵每个位置的上下左右四个相邻的数加起来能被2整除,求最少的转换数 首先,n 的规模并不大,最大只有15.但是完全枚举整个矩阵显 ...

随机推荐

  1. 在html里网页中嵌入优酷的视频

    <html> <embed src="http://player.youku.com/player.php/sid/XMjAzOTk4NjI4/v.swf" qu ...

  2. MATLAB矩阵基础运算

    1.矩阵的加减运算X+Y或者X-Y:元素对应相加减.在此要求X与Y必须是同维矩阵,否则会出现错误信息.如果Y为一个数,则表示X中每一元素+Y或者-Y: %当X和Y都为同维矩阵时 X=[1,2,-3;2 ...

  3. 【GLSL教程】(四)shder的简单示例 【转】

    http://blog.csdn.net/racehorse/article/details/6638455 GLSL的Hello World 这一节中包含一个最基本的shader,它提供如下功能:顶 ...

  4. 搭建k8s集群的手顺

    https://www.cnblogs.com/netsa/category/1137187.html

  5. 127.0.0.1和localhost和本机IP三者的区别

    1,什么是环回地址??与127.0.0.1的区别呢?? 环回地址是主机用于向自身发送通信的一个特殊地址(也就是一个特殊的目的地址). 可以这么说:同一台主机上的两项服务若使用环回地址而非分配的主机地址 ...

  6. $ is not defined

    $ is not defined 引入Jquery的顺序不正确,要把它放在第一个引入

  7. 【MVC】初识MVC

    一.MVC是什么?     MVC(Model-View-Controller),是视图-模型-控制器的框架,刚開始看见这些概念的时候,我以为是U-D-B呢?视图界面,模型是相应这数据库呢,而控制器是 ...

  8. C# DateTime和String(转)

    http://www.cnblogs.com/Pickuper/articles/2058880.html C#语言之“string格式的日期时间字符串转为DateTime类型”的方法 方法一:Con ...

  9. Html5上传插件封装

    前段时间将flash的上传控件替换成使用纯js实现的,在此记录 1.创建标签 <div class="camera-area" style="display:inl ...

  10. Lua学习八----------Lua运算符

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua运算符: - 算术运算符:+(加法).-(减法).*(乘法)./(除法-取整).%(除法-取余).^(乘幂).-(负号) - 关系运算符:= ...