高斯消元枚举自由元——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);
        }
    }
}

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

相关文章推荐

POJ 1222 EXTENDED LIGHTS OUT 高斯消元?暴力枚举!

题目链接:http://poj.org/problem?id=1222 题目大意:给一个6*5的矩阵,表示30个灯泡的开关情况,其中0代表关,1代表开。可以认为每个灯上有一个开关,按下开关之...

[poj 1830]开关问题 高斯消元+自由变量枚举

开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5407   Accepted:...
  • ahm001
  • ahm001
  • 2014年07月02日 10:00
  • 795

poj 1681 Painter's Problem 高斯消元 枚举自由变元

Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5598 ...

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

题目: Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34731   Accepted: ...

POJ 3185 高斯消元+DFS枚举自由变量

题意:奶牛有20只碗摆成一排,用鼻子顶某只碗的话,包括左右两只在内的一共三只碗会反向,现在给出碗的初始状态,问至少要用鼻子顶多少次才能使所有碗都朝上。 #include #include #incl...
  • Tsaid
  • Tsaid
  • 2012年03月08日 22:31
  • 1739

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

Flip Game Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit St...

高斯消元+枚举自由变量

/* 高斯消元+枚举自由变量 */ #include #include #include using namespace std; int T , N ,M ; int num[110] ; in...

POJ 1222 EXTENDED LIGHTS OUT 枚举 || 高斯消元

题目大意就不说了,就是把棋盘上的1全变0即可 如果枚举的话,看似有2的30次方中可能,其实不是。 实际上只需要枚举第一行的状态即可,再往后,如果想要解决问题,必须根据第一行的状态推下去。 对于每...

poj 1222 EXTENDED LIGHTS OUT (高斯消元)

EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 782...
  • whai362
  • whai362
  • 2015年10月06日 11:56
  • 198

POJ1222(高斯消元)

高斯消元 /* * Author: xioumu * Created Time: 2011-11-4 16:24:07 * File Name: p1222.cpp */ #includ...
  • xiou_mu
  • xiou_mu
  • 2011年11月04日 18:59
  • 345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高斯消元枚举自由元——poj1222
举报原因:
原因补充:

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