高斯消元枚举自由元——poj1222

原创 2016年08月28日 23:10:58
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
int a[230][230],x[230],free_x[230],free_num,r,c;
int Gauss()
{
    int k,col,max_r,i,j;
    for(free_num=k=col=0;k<r&&col<c;col++)  //枚举行,列从0开始
    {
        max_r=k;
        for(i=k+1;i<r;i++)
            if(abs(a[i][col])>abs(a[max_r][col]) )max_r=i;   //找到这一列里面绝对值最大的
        if(!a[max_r][col])
        {
            free_x[free_num++]=col;
            continue;   //最大的都是0,那么这一列不用考虑了
        }
        if(max_r!=k)
            for(i=col;i<=c;i++) swap(a[max_r][i],a[k][i]);  //否则交换
        for(i=k+1;i<r;i++)
            if(a[i][col]!=0)
                for(j=col;j<=c;j++) a[i][j]^=a[k][j];
        k++;
    }
    for(i=k;i<r;i++)
        if(a[i][col]) return -1;
    if(k<c) return c-k;
    for(i=c-1;i>=0;i--)
    {
        x[i]=a[i][c];
        for(j=i+1;j<c;j++)
            x[i]^=(a[i][j]&&x[j]);
    }
    return 0;
}
int main()
{
    int i,j,T,n,v,ans;
    char s[16];
    scanf("%d",&T);
    while(T--)
    {
        memset(a,0,sizeof(a));
        memset(x,0,sizeof(x));
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%s",s);
            for(j=0;j<n;j++)
                if(s[j]=='y') a[i*n+j][n*n]=0;
                else a[i*n+j][n*n]=1;
        }
        c=r=n*n;
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
            {
               v=i*n+j;
               a[v][v]=1;
               if(i>0) a[v-n][v]=1;
               if(i<n-1) a[v+n][v]=1;
               if(j>0) a[v-1][v]=1;
               if(j<n-1) a[v+1][v]=1;
            }
        v=Gauss();
        if(v<0)
        {
            printf("inf\n");
            continue;
        }
        if(v==0)
        {
            ans=0;
            for(i=0;i<n*n;i++)
                if(x[i]) ans++;
            printf("%d\n",ans);
        }
        else
        {
            ans=0x7fffffff;
            int tot=1<<v;
            for(i=0;i<tot;i++)
            {
                int cnt=0;
                for(j=0;j<v;j++)
                    if(i&(1<<j))
                    {
                        cnt++;
                        x[free_x[j]]=1;
                    }
                    else x[free_x[j]]=0;
                for(j=c-v-1;j>=0;j--)
                {
                    int p;
                    for(p=j;p<c;p++)
                        if(a[j][p]) break;
                    x[p]=a[j][c];
                    for(int l=p+1;l<c;l++)
                        if(a[j][l]) x[p]^=x[l];
                    if(x[p]) cnt++;
                }
                ans=min(ans,cnt);
            }
            printf("%d\n",ans);
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

【HDU】3915 Game 高斯消元求自由元个数

传送门:【HDU】3915 Game
  • u013368721
  • u013368721
  • 2014年11月02日 19:33
  • 1147

poj 1222 高斯消元详解

题意 有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭。 然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转。 现在要你求出一个5 * 6的矩阵,1表示这个灯被...
  • u013508213
  • u013508213
  • 2015年08月03日 22:34
  • 2358

【POJ1830】开关问题 高斯消元求自由元

题意:中文题。 题解: 呃,求自由元个数,然后输出1 如果无解输出那个题中给的串。 诶网上代码真不可看,我绝望了决定照自己想法随便写写。 然后49行没压行搞过去了。 网上全是100行+什么心态...
  • Vmurder
  • Vmurder
  • 2015年02月04日 09:55
  • 1757

POJ 1753 Flip Game(高斯消元法,枚举自由变元)

题目: Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34731   Accepted: ...
  • u013840081
  • u013840081
  • 2015年08月26日 21:51
  • 798

HDU 5833 Zhu and 772002 高斯消元解异或方程组,求自由元个数,bitset压位

Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
  • just_sort
  • just_sort
  • 2017年03月04日 16:54
  • 618

高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185

最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了。现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧。 专题:http://acm.hust.edu.cn/vj...
  • u010885899
  • u010885899
  • 2015年11月11日 15:30
  • 633

2016ccpc 1002(hdu5833)题解 (高斯消元求异或方程组自由变元)

比赛结束才知道是个高斯消元的题目,吓得我赶紧学了一发,然后惊讶的发现白皮书上原题QAQ. 由于刚学会,虽然是手敲但有些细节还是比对了模板,所以并不能解释,先放一发代码,等熟练了再补. 代码: #i...
  • johsnows
  • johsnows
  • 2016年08月15日 17:21
  • 665

高斯消元法 (模板)

/* 用于求整数解得方程组. */ #include #include #include using namespace std; const int maxn = 105; //矩阵大小 i...
  • FeBr2
  • FeBr2
  • 2016年08月15日 14:35
  • 545

sgu-200 Cracking RSA(简单的高斯消元求自由变元个数)

题目大意: 给你一个t,m,接下来输入m个数a1。。。。am满足ai的质因数包含在前t个质数中 从中取出任意个数,使得乘积为完全平方数,问有多少种取法。 解题思路:...
  • qq_21995319
  • qq_21995319
  • 2014年12月20日 14:07
  • 967

poj1222 枚举 和 高斯消元

接触开关问题,最先的方法是枚举。然后接触
  • u012915516
  • u012915516
  • 2014年04月14日 13:59
  • 450
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高斯消元枚举自由元——poj1222
举报原因:
原因补充:

(最多只允许输入30个字)