程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ1753(高斯消元建模)

POJ1753(高斯消元建模)

編輯:C++入門知識

 

[cpp]  #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; 

#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;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved