uva 11464

/**
 * @brief uva 11464
 * @file 11464.cpp
 * @author mianma
 * @created 2014/12/16 17:53
 * @edited  2014/12/16 17:53
 * @type brute
 * @note
 */
#include <fstream>
#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;

#define max(a, b)  ((a) > (b) ? (a) : (b))
#define min(a, b)  ((a) > (b) ? (b) : (a)) 
#define abs(a)     ((a) >  0  ? (a) : (0 - (a)))
#define CLR(vec)   memset(vec, 0, sizeof(vec))

#ifdef DEBUG
ifstream in;
ofstream out;
#define CIN in
#define COUT out
#else
#define CIN cin
#define COUT cout
#endif

#define INF  10000000
#define MAXN 20

int n, t;
int ans;
int base[MAXN][MAXN], record[MAXN][MAXN];

int solve(const int &bmp){
    int sum;
    CLR(record);
    for(int i = 0; i < n; i++){
        if(bmp& (1 << i))
            record[1][i + 1] = 1;
        else if(base[1][i + 1])
            return INF;
        else
            ;
    }
    for(int i = 2; i <= n; i++)
        for(int j = 1; j <= n; j++){
            sum = record[i - 2][j] + record[i - 1][j - 1] + record[i - 1][j + 1];   
            record[i][j] = sum & 0x1 ? 1 : 0;
            if(0 == record[i][j] && base[i][j])
                return INF;
        }
    sum = 0;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            if(record[i][j] != base[i][j])
                    ++sum;
    return sum;
}

int main(void){
    ios_base::sync_with_stdio(0);
#ifdef DEBUG
    CIN.open("./in",  ios::in);
    COUT.open("./out",  ios::out);
#endif
    CIN >> t;
    for(int cases = 1; cases <= t; cases++){
        CIN >> n; 
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                CIN >> base[i][j];

        /*brute start*/
        ans = INF;
        for(int i = 0; i < (1 << n); i++)
            ans = min(ans, solve(i));
        COUT << "Case " << cases << ": " << (INF == ans ? -1 : ans) << "\n";
    }
    return 0;
}
时间: 2024-10-21 04:36:22

uva 11464的相关文章

枚举 UVA 11464 Even Parity

题目传送门 1 /* 2 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 3 枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 4 最后检查不同的数量,取最小值 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 using namespace std; 10 11 const int MAXN = 20;

uva 11464 Even Parity(逐层递推)

uva 11464 Even Parity We have a grid of size N x N. Each cell of the grid initially contains a zero(0) or a one(1). The parity of a cell is the number of 1s surrounding that cell. A cell is surrounded by at most 4 cells (top, bottom, left, right). Su

Uva 11464 偶数矩阵

题目链接:https://uva.onlinejudge.org/external/114/11464.pdf 和开关问题类似,只不过现在是用的位运算操作更简单了,其中要注意的是,只能将0变成1. 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define inf 0x3f3f3f3f 6 7 int a[20][20]; 8 int b[20][20]; 9 int n; 10 11 int dr[3] = {-1,0,0}

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 initially contains a zero(0) or a one(1). The parity of a cell is the number of 1s surrounding that cell. A cell is surrounded by at most 4 cells (top,

UVA 11464 - Even Parity 状态压缩,分析 难度: 2

题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2459 题意 N*N 的01方阵,可用操作为把任意0变为1,求操作的最小次数,使得任意位置的上下左右之和(不包含自身)为偶数 思路 如刘书,关键在于状态只有第一行的2^15个. 感想 1. 忘了memset 代码 #include <algorithm> #include

UVa 11464 Even Parity

题意:给出n*n的01矩阵,将尽量少的0变成1,使得每个元素的上下左右的元素的和为偶数 看的白书的思路,二进制枚举第一行,再依次算出改变元素的个数, 自己写的时候发现这里不会写,“每个元素的上下左右的元素” 大概就是这个意思 真是太捉急了的说-----------5555 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<s

UVA 11464 暴力+位运算 ***

题意:给你一个 n * n 的 01 矩阵,现在你的任务是将这个矩阵中尽量少的 0 转化为 1 ,使得每个数的上下左右四个相邻的数加起来是偶数.求最少的转化个数. 新风格代码 lrj书上说的很清楚了,就是判断下一行的代码有点冗余了,但是很好理解,就是模拟每位有的数字之和,然后判断未知为应该填的数字 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring>

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

题意:给你一个n*n的01矩阵,让你把这个矩阵中尽量少的0转换成1,使得矩阵每个位置的上下左右四个相邻的数加起来能被2整除,求最少的转换数 首先,n 的规模并不大,最大只有15.但是完全枚举整个矩阵显然是不可能的(2225 ≍ 5 * 1067).但是我们可以枚举第一行,然后用第一行来算出后面的所有行. 但是,怎么算呢? 先来说下算法.对于每一行,我们通过他上面的两行来决定他的值.如果上面两行得到值为奇数,那么这一行就赋值为 1 ,否则赋值为 0 . 然后与原始矩阵比较,如果是由 1 变 0 那

大白书

UVA 11292 (简单贪心) 题意: n条恶龙,m个勇士,用勇士来杀恶龙.一个勇士只能杀一个恶龙.而且勇士只能杀直径不超过自己能力值的恶龙.每个勇士需要支付能力值一样的金币.问杀掉所有恶龙需要的最少金币. 思路: 贪心,均从小到大排序.为每一条龙找一个恰好能杀他的骑士.简单贪心. UVA 11729 (经典贪心问题) 题意: n个任务,需要交代B分钟,执行J分钟,让你合理选择交代任务的次序,求得n个任务完成的最小总时长. 思路: 经典贪心,通过比较俩俩的关系,得到整个序列的贪心排序方法.这个