高斯枚举自由元小板子 (待测试)

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int mp[16][16];
int x[16*16+2];// 用来存储解的情况
int a[16*16+2][16*16+2];
const int inf=90000009;
void init()
{
    memset(x,0,sizeof(x));
    memset(a,0,sizeof(a));
}
int check(int x,int y,int n)
{
    if(x<=0 || x>=n+1 || y<=0 || y>=n+1) return -1;
    return 1;
}
void Debug(int n,int m)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++) cout<<a[i][j]<<‘ ‘;
        cout<<endl;
    }
}
int gauss(int n)
{
    int max_r;
    int col,k;
    int i,j;
    int free_num=0;
    int freex[16+2];
    for(int z=1;z<=n;z++) // 构造方程矩阵
    {
        for(int zz=1;zz<=n;zz++)
        {
            i=(z-1)*n+zz;// row
            j=(z-1)*n+zz;
            a[i][n*n+1]=mp[z][zz];
            a[i][j]=1;
            for(int low=0;low<4;low++)
            {
                int xx=z+dir[low][0];
                int yy=zz+dir[low][1];
                if(check(xx,yy,n)==1) //attention !!
                {
                    j=(xx-1)*n+yy;
                  //  cout<<low<<‘ ‘<<xx<<‘ ‘<<yy<<endl;
                    a[i][j]=1;
                }
            }
        }
    }
   //Debug(n*n,n*n+1);
    col=k=1;
    while( k<=n*n && col<=n*n)
    {
        max_r=k;
        for(int u=k;u<=n*n;u++) if(a[u][col])
        {
            max_r=u;
            break;
        }
        if(a[max_r][col]!=0)
        {
            if(max_r!=k)
            {
                for(int u=0;u<=n*n+1;u++) swap(a[max_r][u],a[k][u]);
            }
            for(int u=k+1;u<=n*n;u++)  // 转化为行阶梯
            {
                if(a[u][col])
                {
                    for(int z=0;z<=n*n+1;z++) a[u][z]^=a[k][z];
                }
            }
            k++;
        }
        else freex[free_num++]=col; // 当最大的也是0的时候,对应的col为自由元
        col++;
    }
   // Debug(n*n,n*n+1);
    // 无解的时候
    for(int u=k;u<=n*n;u++)
    {
        for(int uu=1;uu<=n*n+1;uu++) if(a[u][uu]) return -1;
    }
  //  cout<<"123"<<endl;
  //  cout<<k<<endl;
    if(k==n*n+1) // 有唯一解的时候
    {
    //    cout<<"1234"<<endl;
        int temp=0;
        int ret=0;
        for(int z=n*n; z>=1; z--)
        {
            x[z]=a[z][n*n+1];
            for(int zz=z+1; zz<=n*n; zz++) if(a[z][zz])
                {
                    x[z]^=x[zz];
                }
            if(x[z]==1) ret++;
        }
        return ret;
    }
    // 枚举自由变元
    int ans=inf;
    for(int i=0;i<(1<<free_num);i++) // 二进制枚举
    {
        int cnt=0;
        int temp=i;
        for(int j=0;j<free_num;j++)
        {
            if(temp & (1<<j))
            {
                x[freex[j]]=1;
                cnt++;
            }
        }

        for(int z=n*n; z>=1; z--)
        {
            x[z]=a[z][n*n+1];
            for(int zz=z+1; zz<=n*n; zz++) if(a[z][zz])
                {
                    x[z]^=x[zz];
                }
            if(x[z]==1) cnt++;
        }
        ans=min(ans,cnt);
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    int Case=0;
    while(t--)
    {
        int n;
        init();//a x
        scanf("%d",&n);
        char temp[16][16];
        for(int i=0;i<n;i++)
        {
            scanf("%s",temp[i]);
        }
        for(int i=0;i<n;i++) // 增广矩阵
        {
            for(int j=0;j<n;j++)
            {
                if(temp[i][j]==‘y‘) mp[i+1][j+1]=0;
                else mp[i+1][j+1]=1;
            }
        }
        int flag=gauss(n);
        if(flag==-1)
        {
            cout<<"inf"<<endl;
            continue;
        }

        /*
        for(int i=1;i<=30;i++)
        {
            if(i%6!=0) printf("%d ",x[i]);
            else printf("%d\n",x[i]);
        }
        */
        cout<<flag<<endl;
    }
    return 0;
}
时间: 2024-10-03 23:17:46

高斯枚举自由元小板子 (待测试)的相关文章

poj1753--Flip Game(高斯消元问题2,枚举自由元的首杀)

Flip Game Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white an

微信+WeTest:小程序云端测试系统上线

日前,微信新增小程序测试系统,可便于开发者检测小程序缺陷,评估小程序产品质量.在小程序发布之前,开发者可将小程序代码提交到测试系统,在不同型号的手机真机上运行,执行完毕后自动生成测试报告.小程序云端测试平台,由WeTest提供基础支持,下载"微信开发者工具"即可使用. 小程序测试报告示例:  一. 云真机测试 Beta 为了方便广大开发者检测小程序程序缺陷.评估小程序产品质量,微信提供了免费的云真机测试环境以及一整套测试方案.在小程序交付到真实用户手中使用之前,你可以将小程序分发到云真

2017-6-6小书匠发布测试

2017-6-6小书匠发布测试 新建 模板 小书匠 欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过设置里的修改模板来改变新建文章的内容.

5、Cocos2dx 3.0游戏开发找小三之测试样例简介及小结

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 测试样例简介 Cocos2d-x 为我们提供了十分丰富的测试样例,这些测试样例是在引擎开发过程中为测试引擎的正确性而编写的代码,同时也是演示引擎各个部分如何使用的良好示例. 打开Cocos2d-x根目录下build文件夹下的cocos2d-win32.vc2012.sln解决方案,设置其中的 cpp-tests 项目为启动项目,成功运行后

小程序本地测试没有问题,苹果正常,安卓无法发送请求?

小程序本地测试没有问题,苹果正常,安卓无法发送请求,https ssl证书正常. Page({ data:{ height:height, width:width, }, onLoad:function(options){ // 页面初始化 options为页面跳转所带来的参数 wx.login({ success: function (loginres) { code = loginres.code; wx.getUserInfo({ withCredentials:true, success

小游戏体验——测试王者荣耀的英雄人物

小游戏体验——测试王者荣耀的英雄人物 代码如下: 原文地址:https://www.cnblogs.com/sherryStudy/p/hreo_play.html

高斯消元小小结

所谓高斯消元,就是一种解线性方程组的算法. 学过线性代数的同学都知道,线性方程组本质就是一个向量X1左乘一个系数矩阵A得到另一个向量X2,我们要求解的就是所有未知数构成的向量X1. 设一个n元一次方程组,我们把所有未知数的系数以及等号右边的常数在保持相对位置不变的情况下组成一个n行n+1列的矩阵, a11 a12 a13 ...... a1n b1a21 a22 a23 ...... a2n b2......an1 an2 an3 ...... ann bn 然后我们通过矩阵的初等变换,每个方程

poj sticks 木棍 枚举+搜索+小技巧

这大概是我复赛前看过的题了,那个时候的我其实还不是很会打搜索,甚至认为搜索,枚举的效率都是很低的,是不能够把题AC的,后来为了改变这种看法(其实是因为我发现一些我想不出的题的AC程序里大多有搜索,枚举的算法,格外揪心,没想到竟这么简单).才做了一些搜索的题.这就是那些年曾令我揪心的题之一,想不出,去百度,这么简单,心碎了.的确搜索如果剪枝做的好的话,是可以把一些题目AC的. .   好吧!可打完后提交的第一次还是TLE了,心好累.去别人的博客园看了一下,其实大家都差不多.仔细一看才发现别人是降序

小程序开发测试教程

小程序技术文档 一.小程序应用分析 简单介绍 小程序是一种微信开发不需要下载安装即可使用的应用. 实质 微信小程序就是Hybrid技术的应用. Hybrid App(混合模式移动应用). 小程序能够更多的可以更多的调用手机本身的功能(如位置信息,摄像头等). 小程序注册 小程序开发框架的逻辑层是由JavaScript编写. 逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈.小程序再次基础上做了一些修改方便开发: 增加 App 和 Page 方法,进行程序和页面的注册. App() 函