http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4835
由题意,有:
(x1-x11)^2 + (x2-x12)^2 ... = D[1]^2
(x1-x21)^2 + (x2-x22)^2 ... = D[2]^2
...
(x1-x12,1)^2 + (x2-x12,2)^2 ... = D[12]^2
所以
-x1^2 + x11 * x1 .... = (-D[12] ^ 2 + x11` ^ 2 + x12 ^ 2 ....)/2
-x1^2 + x21 * x1 .... = (-D[22] ^ 2 + x21 ^ 2 + x22 ^ 2 ....)/2
高斯消元即可
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn = 15; double g[maxn][maxn],x[maxn]; double eps = 1e-8; void debug(){ for(int i=0;i<12;i++){ for(int j=0;j<12;j++){ printf("%.2f%c",g[i][j],j==11?‘\n‘:‘ ‘); } } } void gauss(){ memset(x,0,sizeof x); for(int i = 0;i < 12;i++){ g[i][11] = -g[i][11] * g[i][11]; } for(int i = 0;i < 12;i++){ for(int j = 0;j < 11;j++){ g[i][11] += g[i][j] * g[i][j]; } } for(int i = 0;i < 12;i++){ g[i][11] /= 2; } for(int i = 0;i < 11;i++){ for(int j = 0;j < 12;j++){ g[i][j] -= g[11][j]; } } for(int i = 0;i < 11;i++){ //puts("begin"); // debug(); int maxr = i; for(int j = i;j < 11;j++){ if(fabs(g[j][i]) > fabs(g[maxr][i])){ maxr=j; } } if(maxr != i){ for(int j = i;j < 12;j++){ swap(g[i][j],g[maxr][j]); } } // puts("after swap"); // debug(); for(int j = i + 1;j < 11;j++){ if(g[j][i] != 0){ double tmp = -g[j][i]/g[i][i]; for(int k = i;k < 12;k++){ g[j][k] += tmp * g[i][k]; } } } } for(int i = 10;i >= 0;i--){ double tmp = 0; for(int j = i + 1;j < 11;j++){ tmp += g[i][j] * x[j]; } x[i] = (g[i][11] - tmp) / g[i][i]; } } 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",g[i]+j); } } gauss(); for(int i=0;i<11;i++){ printf("%.2f%c",fabs(x[i])<eps?0:x[i],i==10?‘\n‘:‘ ‘); } } }
原文:http://www.cnblogs.com/xuesu/p/4509456.html