您的位置:首页 > 其它

UVA - 11464-:Even Parity(暴力模拟)

2017-12-04 20:22 423 查看
题目链接:点击打开链接

题目大意:

给一个01矩阵,每个矩阵每个位置有一个数值,这个数值为该格上下左右的1的个数。将矩阵中的0变为1,使得最后形成的矩阵中的各个数值为偶数。

解题思路:

bfs加hash铁定会T,从问题出发的话比较难做。可以考虑先构造最后的结果矩阵,然后从结果矩阵判断哪种情况对应的0变1的次数是最小的。因为要求各个数值必须是偶数,所以如果可以明白第一行的01情况的话,可以顺推出一个合理的矩阵。最终答案就是枚举第一行的情况推出所有可能矩阵,然后判断哪种情况是变化次数最小的。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=1e9+7;
const int N=1e5+5;
int dx[3]={0,0,-1};
int dy[3]={1,-1,0};
int n,ans;
int s[20][20];
int c[20][20];
void vs(int k)
{
memset(c,0,sizeof c);
int g=1;
while(k)
{
c[1][g++]=k%2;
k=k/2;
}
}
int main()
{
int QAQ,kase=0;
scanf("%d",&QAQ);
while(QAQ--)
{
ans=INF;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&s[i][j]);
for(int gh=0;gh<(1<<15);gh++) //枚举第一行的情况
{
vs(gh);
for(int i=1;i<n;i++) //通过第一行枚举出整个矩阵情况
{
for(int j=1;j<=n;j++)
{
int rk=0;
for(int k=0;k<3;k++) //通过判断上左右1的数量确定下方1的情况
{
int xx=i+dx[k];
int yy=j+dy[k];
if(xx<1||xx>n||yy<1||yy>n)
continue;
if(c[xx][yy]==1)
rk++;
}
if(rk==1||rk==3) //推矩阵
c[i+1][j]=1;
else
c[i+1][j]=0;
}
}
int res=0,flag=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(s[i][j]==0&&c[i][j]==1) //判断变化次数
res++;
if(s[i][j]==1&&c[i][j]==0) //判断该矩阵是否合法
flag=0;
}
}
if(flag)
ans=min(ans,res);
}
if(ans==INF)
printf("Case %d: -1\n",++kase);
else
printf("Case %d: %d\n",++kase,ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: