UVA 11464-Even Parity(偶數矩陣-開關問題)
11464 - Even Parity
We have a grid of size N × N. Each cell of the grid initially contains a zero(0) or a one(1). The parityof a cell is the number of 1s surrounding that cell. A cell is surrounded by at most 4 cells (top, bottom,left, right).
Suppose we have a grid of size 4 × 4:
For this problem, you have to change some of the 0s to 1s so that the parity of every cell becomeseven. We are interested in the minimum number of transformations of 0 to 1 that is needed to achievethe desired requirement.
Input
The first line of input is an integer T (T < 30) that indicates the number of test cases. Each case startswith a positive integer N (1 ≤ N ≤ 15). Each of the next N lines contain N integers (0/1) each. Theintegers are separated
by a single space character.
Output
For each case, output the case number followed by the minimum number of transformations required.If it’s impossible to achieve the desired result, then output ‘-1’ instead.
Sample Input
3
3
0 0 0
0 0 0
0 0 0
3
0 0 0
1 0 0
0 0 0
3
1 1 1
1 1 1
0 0 0
Sample Output
Case 1: 0
Case 2: 3
Case 3: -1
題目意思:
有一個N*N的01矩陣,你的任務是把儘量少的0變成1,使得每個元素的上下左右的元素(若存在)均為偶數。
解題思路:
Note:0可以變成1,但是1不能變成0。
N最大是15,我們只需要列舉第一行,每個數只能為0/1,所以最多2^15個,剩下的每一行都可以根據第一行來確定。
求解過程中用一個新的矩陣儲存我們找到的解,與原矩陣相比較,計算出改變的元素個數。
列舉過程中:
①狀態壓縮
if(s & (1<<i)) m[0][i]=1;//判斷該位是否為1
因為數最大範圍是000~111共15種,所以可以分別對應列舉第一行元素值的所有情況。
按位與&運算(只有全1才為1)判斷該位是否為1,如果是1,則新矩陣該位置1;如果原來的矩陣中該位為1,則無法求解,函式直接返回返回無解;
②1不能變成0
if(f[i][j]==1&&m[i][j]==0) return INF;//別忘了這句,1不能轉換成0
注意特判這種無法轉換的情況,無法繼續求解,函式直接返回返回無解。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <bitset>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 16
int m[maxn][maxn],f[maxn][maxn];
int n;
int valid(int s)
{
memset(m,0,sizeof(m));
int cnt=0;
for(int i=0; i<n; ++i)
{
if(s & (1<<i)) m[0][i]=1;
else if(f[0][i]==1) return INF;
}
for(int i=1; i<n; ++i)
for(int j=0; j<n; ++j)
{
int sum=0;
if(i>1)//上
sum+=m[i-2][j];
if(j>0)//左
sum+=m[i-1][j-1];
if(j+1<n)//右
sum+=m[i-1][j+1];
m[i][j]=sum%2;
if(f[i][j]==1&&m[i][j]==0) return INF;//別忘了這句,1不能轉換成0
}
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
if(m[i][j]!=f[i][j]) ++cnt;
return cnt;
}
int main()
{
int t,ca=0;
scanf("%d",&t);
while(t--)
{
int ans=INF;
scanf("%d",&n);
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
scanf("%d",&f[i][j]);
for(int i=0; i<(1<<n); ++i)
ans=min(ans,valid(i));
if(ans==INF) ans=-1;
printf("Case %d: %d\n",++ca,ans);
}
return 0;
}
/*
3
3
0 0 0
0 0 0
0 0 0
3
0 0 0
1 0 0
0 0 0
3
1 1 1
1 1 1
0 0 0
*/
相關文章
- 矩陣連乘問題矩陣
- UVA 10655 Contemplation! Algebra (矩陣快速冪)矩陣
- 暴力列舉- uva11464 - Even Parity
- 演算法題:矩陣鏈乘問題演算法矩陣
- 陣列進行奇數和偶數操作 把奇數放在陣列前面 偶數放在陣列後面陣列
- 關聯矩陣矩陣
- UVA 11464 Even Parity(部分列舉 遞推)
- 演算法題系列:矩陣鏈乘問題演算法矩陣
- 3.5、矩陣變數矩陣變數
- 面試題21:調整陣列順序奇數位於偶數前面面試題陣列
- 數學建模例題2.28 矩陣合併示例矩陣
- 數學建模例題例 2.29 矩陣分割示例矩陣
- 伴隨矩陣和逆矩陣的關係證明矩陣
- 利用瓊斯矩陣求解一般偏振問題矩陣
- 求陣列內所有偶數的和陣列
- 高等代數1 矩陣矩陣
- 線性代數--矩陣矩陣
- 調整陣列順序使奇數位於偶數前面,偶數和偶數之間的相對位置不變陣列
- 數學建模例題2.30 矩陣元素求和示例矩陣
- 矩陣連乘問題 Python 動態規劃矩陣Python動態規劃
- 生成螺旋矩陣(方陣、矩陣)矩陣
- 動態規劃6:臺階問題和矩陣最小路徑問題動態規劃矩陣
- [每日一題] 第十一題:調整陣列順序使奇數位於偶數前面每日一題陣列
- 鄰接矩陣、度矩陣矩陣
- 巨大的矩陣(矩陣加速)矩陣
- lisp 習題 矩陣旋轉Lisp矩陣
- 奇異矩陣,非奇異矩陣,偽逆矩陣矩陣
- 楊氏矩陣:查詢x是否在矩陣中,第K大數矩陣
- 線性規劃的對偶問題——由拉格朗日對偶問題匯出
- HDU 2254 奧運(數論+矩陣)矩陣
- 巨大的數(dp+矩陣加速)矩陣
- 幸運數(dp+矩陣加速)矩陣
- c++偶現問題備錄C++
- 劍指offer面試題14 調整陣列順序使奇數位於偶數前面面試題陣列
- 【矩陣求導】關於點乘 (哈達瑪積)的矩陣求導矩陣求導點乘
- 面試演算法題(4)--將一個整數陣列中的所有奇數放到偶數前面面試演算法陣列
- HDU 3059 Fibonacci數列與矩陣求和 矩陣大小不固定矩陣
- 動態規劃_備忘錄法_矩陣鏈乘問題動態規劃矩陣