ZOJ 3645高斯消元
高斯消元是求方程组解的一般方法:
它在求矩阵的逆矩阵的时候也最方便的方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <cstring> #include <stdlib.h> #include <math.h> #include <iostream> using namespace std; #define max(a,b) ((a) > (b) ? (a) : (b)) #define min(a,b) ((a) < (b) ? (a) : (b)) #define eps 1e-6 const int Max = 19; double mat[Max][Max]; double c[Max][Max]; double ans[Max]; int main() { int t; scanf("%d",&t); while(t--){ for(int i=0;i<12;i++){ for(int j=0;j<12;j++){ scanf("%lf",&mat[i][j]); } } for(int i=0;i<12;i++) c[i][11] = mat[i][11]*mat[i][11]; for(int i=0;i<12;i++){ for(int j=0;j<11;j++){ c[i][j] = -2*mat[i][j]; c[i][11] -= mat[i][j]*mat[i][j]; } } for(int i=0;i<11;i++){ for(int j=0;j<12;j++){ c[i][j]-=c[i+1][j]; } } for(int i=0;i<11;i++){ if(c[i][i] == 0){ for(int j=i+1;j<11;j++){ if(c[j][i] != 0){ for(int k=0;k<12;k++) swap(c[i][k],c[j][k]); break; } } } for(int j=i+1;j<11;j++){ double be = c[j][i]/c[i][i]; if(be == 0) continue; for(int k=i;k<12;k++){ c[j][k] -= c[i][k]*be; } } } ans[10] = c[10][11]/c[10][10]; for(int i=9;i>=0;i--){ ans[i]=c[i][11]; for(int j=i+1;j<11;j++){ ans[i]-=c[i][j]*ans[j]; } ans[i] /= c[i][i]; } for(int i=0;i<10;i++){ printf("%.2lf ",ans[i]+eps); } printf("%.2lf\n",ans[10]+eps); } return 0; }