思路
设圆心为,
点坐标为
.
因为点到圆心的距离的平方为
.
这样有个式子.这些式子两两相减可以得到
个
元一次方程组,这样直接跑高斯消元解出圆心坐标即可.
复杂度为.
代码
#include<bits/stdc++.h>
using namespace std;
#define Re register
#define MAXN 15
#define LD long double
int N;
LD a[MAXN][MAXN], b[MAXN][MAXN];
int main(){
scanf( "%d", &N );
for ( int i = 1; i <= N + 1; ++i )
for ( int j = 1; j <= N; ++j )
scanf( "%Lf", &a[i][j] );
for ( int i = 1; i <= N; ++i )
for ( int j = 1; j <= N; ++j )
b[i][j] = 2 * ( a[i + 1][j] - a[i][j] ), b[i][N + 1] += a[i + 1][j] * a[i + 1][j] - a[i][j] * a[i][j];
for ( int i = 1; i <= N; ++i )
for ( int j = i + 1; j <= N; ++j ){
LD t( b[j][i] / b[i][i] );
for ( int k = i; k <= N + 1; ++k ) b[j][k] -= t * b[i][k];
}
for ( int i = N; i >= 1; --i ){
b[i][N + 1] /= b[i][i];
for ( int j = i - 1; j >= 1; --j ) b[j][N + 1] -= b[i][N + 1] * b[j][i];
}
for ( int i = 1; i <= N; ++i ) printf( "%.3Lf ", b[i][N + 1] );
return 0;
} 
京公网安备 11010502036488号