Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

POJ1753(高斯消元建模)

$
0
0

题目:Flip Game

 

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N=105;

int equ,var;
int a[N][N];
int b[N][N];
int x[N];
bool free_x[N];
int free_num;
int ans=100000000;

int absx(int x)
{
    return x<0? -x:x;
}

void Debug()
{
    int i,j;
    for(i=0;i<equ;i++)
    {
        for(j=0;j<var+1;j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
}

int gcd(int a,int b)
{
    return b? gcd(b,a%b):a;
}

int lcm(int a,int b)
{
    return a/gcd(a,b)*b;
}

int dfs(int p)
{
    int i,j;
    if(p<free_num)
    {
        for(i=free_num-1;i>=0;i--)
        {
            int temp=a[i][var]%2;
            for(j=i+1;j<var;j++)
                if(a[i][j]!=0)
                    temp=(temp-(a[i][j]*x[j])%2+2)%2;
            x[i]=(temp/a[i][i])%2;
        }
        int sum=0;
        for(int i=0;i<var;i++) sum+=x[i];
        if(ans>sum) ans=sum;
        return 0;
    }
    x[p]=0;
    dfs(p-1);
    x[p]=1;
    dfs(p-1);
}

int Gauss()
{
    int i,j,k,col=0;
    for(k=0;k<equ&&col<var;k++,col++)
    {
        int max_r=k;
        for(i=k+1;i<equ;i++)
        {
            if(a[i][col]>a[max_r][col]) max_r=i;
        }
        if(max_r!=k)
        {
            for(i=k;i<var+1;i++)
                swap(a[k][i],a[max_r][i]);
        }
        if(a[k][col]==0)
        {
            k--;continue;
        }
        for(i=k+1;i<equ;i++)
        {
            if(a[i][col]!=0)
            {
                int LCM=lcm(a[i][col],a[k][col]);
                int ta=LCM/a[i][col];
                int tb=LCM/a[k][col];
                if(a[i][col]*a[k][col]<0) tb=-tb;
                for(j=col;j<var+1;j++)
                    a[i][j]=((a[i][j]*ta)%2-(a[k][j]*tb)%2+2)%2;
            }
        }
    }
    for(i=k;i<equ;i++)
        if(a[i][col]!=0) return -1;
    for(i=0;i<equ;i++)
    {
        if(!a[i][i])
        {
            for(j=i+1;j<var;j++)
                if(a[i][j]) break;
            if(j==var) break;
            for(k=0;k<equ;k++)
                swap(a[k][i],a[k][j]);
        }
    }
    free_num=k;
    if(var-k>0)
    {
        dfs(var-1);
        return ans;
    }
    if(var-k==0)
    {
        for(i=k-1;i>=0;i--)
        {
            int temp=a[i][var]%2;
            for(j=i+1;j<var;j++)
                if(a[i][j]!=0)
                    temp=(temp-(a[i][j]*x[j])%2+2)%2;
            x[i]=(temp/a[i][i])%2;
        }
        int sum=0;
        for(i=0;i<var;i++) sum+=x[i];
        return sum;
    }
}

int main()
{
    int i,j,k;
    char str[20];
    memset(a,0,sizeof(a));
    memset(x,0,sizeof(x));
    ans=1000000000;
    for(i=0;i<4;i++)
    {
        cin>>str;
        for(j=0;j<4;j++)
        {
            k=4*i+j;
            a[k][k]=1;
            if(i>0) a[k][k-4]=1;
            if(i<3) a[k][k+4]=1;
            if(j>0) a[k][k-1]=1;
            if(j<3) a[k][k+1]=1;
            if(str[j]=='b') a[k][16]=1;
        }
    }
    for(i=0;i<16;i++)
        for(j=0;j<=16;j++)
            b[i][j]=a[i][j];
    for(k=0;k<16;k++)
        b[k][16]^=1;
    equ=var=16;
    int f1=Gauss();
    int min1=ans;
    for(i=0;i<16;i++)
        for(j=0;j<=16;j++)
            a[i][j]=b[i][j];
    ans=100000000;
    int f2=Gauss();
    int min2=ans;
    if (f1==-1&&f2==-1) cout<<"Impossible"<<endl;
    else                cout<<min(ans,min1)<<endl;
    return 0;
}


 

作者:ACdreamers 发表于2013-5-31 3:49:30 原文链接
阅读:122 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>