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);
}
}
题目大意:
给一个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);
}
}
相关文章推荐
- Even Parity UVA - 11464
- uva------(11464)Even Parity
- 例题1.7 偶数矩阵 Even Parity UVA - 11464 部分枚举+递推
- Even Parity Uva 11464 ,
- UVa11464-Even Parity开关问题
- Even Parity UVA - 11464
- UVa 11464 Even Parity / 深搜
- Even Parity UVA 11464
- (uva 11464)偶数矩阵(Even Parity)
- Even Parity UVA 11464
- UVALive 6465 Islands in the Data Stream 暴力模拟
- uva 11464 - Even Parity(暴力枚举)
- UVA 11464 Even Parity(暴力枚举)
- uva1504(模拟+暴力)
- 【暴力模拟】UVA 1594 - Ducci Sequence
- uva 11464 暴力枚举矩阵
- UVA - 201 Squares(模拟 + 暴力)
- UVALive 6089 Nine (暴力模拟)
- uva_11464_Even Parity(枚舉,暴力)
- UVA 11464 暴力+位运算 ***