当前位置:编程学习 > C/C++ >>

高斯消元专题

由于老师的讲课,我又重拾高斯消元,做了一天的高斯,感觉老师讲得很好,模板也不错,我懒得自己写,就把同僚的模板拿过来用了,反正基本原理都懂了。
 高斯消元模板题,只有唯一解。
[cpp] 
#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <algorithm> 
 
using namespace std; 
const int maxn=30; 
int a[maxn][maxn+1],x[maxn]; 
int equ,var,free_num; 
void Debug() 

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

int 易做图(int a,int b) 

     if(a<0) return 易做图(-a,b); 
     if(b<0) return 易做图(a,-b); 
     return b==0?a:易做图(b,a%b); 

int Gauss() 

    int k,col=0; 
    for(k=0;k<equ&&col<var;k++,col++) 
    { 
        int mx=k; 
        for(int i=k+1;i<equ;i++) 
          if(a[i][col]>a[mx][col]) mx=i; 
        if(mx!=k) 
           for(int i=k;i<var+1;i++)  swap(a[k][i],a[mx][i]); 
        if(!a[k][col]) { k--;continue; } 
        for(int i=k+1;i<equ;i++) 
           if(a[i][col]!=0) 
           { 
               int lcm=a[k][col]/易做图(a[k][col],a[i][col])*a[i][col]; 
               int ta=lcm/a[i][col],tb=lcm/a[k][col]; 
               if(a[i][col]*a[k][col] < 0)  tb = -tb; 
               for(int j=col;j<var+1;j++) 
                 a[i][j]=((a[i][j]*ta)%2 - (a[k][j]*tb)%2+2)%2; 
           } 
     } 
    // Debug(); 
     //cout<<col<<endl<<endl; 
     for(int i=k;i<equ;i++) 
        if(a[i][var]) return -1; 
     for(int i=0,j;i<equ;i++) 
         if(!a[i][i]) 
         { 
              for(j=i+1;j<var;j++) 
                 if(a[i][j]) break; 
              if(j>=var) break; 
              for(int r=0;r<equ;r++) swap(a[r][i],a[r][j]); 
         } 
 
         //唯一解 
      for(int i=k-1;i>=0;i--) 
      { 
          int tmp=a[i][var]%2; 
          for(int j=i+1;j<var+1;j++) 
             if(a[i][j]) tmp=(tmp-a[i][j]*x[j]%2+2)%2; 
          x[i]=(tmp/a[i][i])%2; 
      } 

void init() 

     memset(a,0,sizeof(a)); 
     memset(x,0,sizeof(x)); 
     for(int i=0;i<5;i++) 
     for(int j=0;j<6;j++) 
      { 
           if(i!=0) a[i*6+j][(i-1)*6+j]=1; 
           if(i!=4) a[i*6+j][(i+1)*6+j]=1; 
           if(j!=0) a[i*6+j][i*6+j-1]=1; 
           if(j!=5) a[i*6+j][i*6+j+1]=1; 
           a[i*6+j][i*6+j]=1; 
      } 

int main(int argc, char *argv[]) 

    int T,ca=1; 
    scanf("%d",&T); 
    equ=30,var=30; 
    while(T--) 
    { 
        init(); 
        for(int i=0;i<30;i++) scanf("%d",&a[i][30]); 
        Gauss(); 
        printf("PUZZLE #%d\n",ca++); 
        for(int i=0;i<30;i++) 
        { 
            if(i%6!=0) putchar(' '); 
            printf("%d",x[i]); 
            if(i%6==5) puts(""); 
        } 
    } 
    return EXIT_SUCCESS; 

 动最少的砖,枚举自由元,找1的个数最少的那组解。
[cpp]
#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <stdio.h> 
using namespace std; 
const int inf=0x3fffffff; 
 
const int maxn=15*15; 
int a[maxn][maxn+1],x[maxn],equ,var,n; 
 char s[20][20]; 
 
void init() 

    equ=var=n*n; 
    for(int i=0;i<n;i++) 
       scanf("%s",s[i]); 
    memset(a,0,sizeof(a)); 
    for(int i=0;i<var;i++) a[i][var]= (s[i/n][i%n]!='y'),a[i][i]=1; 
    for(int i=0;i<n;i++) 
    for(int j=0;j<n;j++) 
    { 
       /* if(i!=0) a[(i-1)*n+j][i*n+j]=1;
        if(i!=n-1) a[(i+1)*n+j][i*n+j]=1;
        if(j!=0) a[i*n+j-1][i*n+j]=1;
    &

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,