UVA11464 - Even Parity

链接

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2459

题解

枚举第一行,递推出剩下的行,然后验证,时间复杂度 Θ ( 2 n n 2 )
这题写出来 10 m i n d e b u g 半小时,原来是因为我边界没有处理好,多组数据没有清空数组QwQ

代码

//枚举 
#include <cstdio>
#include <algorithm>
#define maxn 20
#define inf 0x3f3f3f3f
using namespace std;
int T, n, ans, a[maxn][maxn], b[maxn][maxn], cost;
void update(int t)
{
    int i, j;
    for(i=1;i<=n;i++)b[1][i]=t&1, t>>=1;
    for(i=0;i<=n+1;i++)b[0][i]=b[n+1][i]=b[i][0]=b[i][n+1]=0;
    for(i=2;i<=n;i++)for(j=1;j<=n;j++)b[i][j]=b[i-1][j-1]^b[i-1][j+1]^b[i-2][j];
    for(i=1;i<=n;i++)for(j=1;j<=n;j++)
        if(b[i+1][j]^b[i][j-1]^b[i][j+1]^b[i-1][j])return;
    cost=0;
    for(i=1;i<=n;i++)for(j=1;j<=n;j++)
    {
        if(a[i][j]==1 and b[i][j]==0)return;
        if(a[i][j]==0 and b[i][j]==1)cost++;
    }
    ans=min(ans,cost);
}
int main()
{
    int i, j, c, t;
    scanf("%d",&T);
    for(c=1;c<=T;c++)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",a[i]+j);
        ans=inf;
        for(t=0;t<1<<n;t++)update(t);
        printf("Case %d: ",c); 
        if(ans==inf)printf("-1\n");
        else printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/fsahfgsadhsakndas/article/details/80959558
今日推荐