c++ - 偶数矩阵,神答案,我看不懂
伊谢尔伦
伊谢尔伦 2017-04-17 11:20:39
[C++讨论组]

给定矩阵由0,1组成,使用最少的改变(使0变成1),使得任何元素的上下左右元素(如果存在)和为偶数

输入: 测试组数, 矩阵大小n ,矩阵每一个数

输出: 最小翻转次数,无法实现则输出-1
有谁能给我解释一下下面代码的check()函数和整段代码的思路,谢谢

    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    using namespace std;

    #define zero(a) memset(a,0,sizeof(a))
    #define one(a) memset(a,1,sizeof(a))
    #define fone(a) memset(a,-1,sizeof(a))
    #define pow2(a) ((a)*(a))
    #define pow3(a) ((pow2(a))*(a))
    #define MAX 10000000
    struct{
    int x,y;
    }a[20][20];
    int n;


    int check(int k)
    {
    int i;
    for(i=0;i<n;i++)
        a[0][i].y=0;
    i=0;
    while(k)
    {
        a[0][i].y=k%2;
        k=k/2;
        i++;
    }

    for(i=0;i<n;i++)
        if(a[0][i].x==1&&a[0][i].y==0)
            return -1;

    return 0;           
    }
    int fun()
    {
    int i,j;
    for(i=1;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            int sum=0;
            if(i>=2)
                sum+=a[i-2][j].y;
            if(j>0)
                sum+=a[i-1][j-1].y;
            if(j<n-1)
                sum+=a[i-1][j+1].y;
            if(sum%2==0)
                a[i][j].y=0;
            else
                a[i][j].y=1;
            if(a[i][j].y==0&&a[i][j].x==1)
                return MAX;
        }

    }

    int cnt=0;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            if(a[i][j].x==0&&a[i][j].y==1)
                cnt++;

    return cnt;
    }



    int main()
    {
        int T;
        int cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int i,j;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&a[i][j].x);
            }
        }

        int ans=MAX;

        for(i=0;i<(1<<n);i++)
        {
            if(check(i)==-1)
                continue;
            ans=min(ans,fun());
        }
        if(ans!=MAX)
            printf("Case %d: %d\n",cas++,ans);
        else
            printf("Case %d: -1\n",cas++);
    }
     return 0;
}
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(1)
PHP中文网

枚举第一行,其它的你应该可以看的懂了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号