题意:
H * W (W,H <= 10) 的矩阵A的某个元素A[i][j],从它出发到其他点的曼哈顿距离小于等于D的所有值的和S[i][j]除上可达点的数目,构成了矩阵B。给定矩阵B,求矩阵A。
分析:
将所有矩阵A的元素看成自变量,一共有H*W个变量,每个矩阵B的元素是由这些变量组合而成的,对于固定的B[i][j],曼哈顿距离在D以内的A[x][y]的系数为1,其它为0,这样就变成了求H*W个变量和H*W个方程的线性方程组,高斯消元求解。这题数据量比较小,所以直接采用浮点数的高斯消元即可,需要注意的是,浮点数消元的时候为了避免精度误差,每次找最大的行,乘上一个小于1的系数进行消元,这样可以把误差降到最小。
本来很快就搞定的,但是脑残了,总是pE,后来又wa,一定要把b[][]变成浮点数,才行,不然会wa 有误差。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #define LL __int64 8 #define eps 1e-8 9 const int maxn = 100+10; 10 using namespace std; 11 int equ, var; 12 double a[maxn][maxn], x[maxn]; 13 14 int Gauss() 15 { 16 int i, j, k, max_r, col; 17 double tmp; 18 col = 0; 19 20 for(k = 0; k<equ && col<var; k++, col++) 21 { 22 max_r = k; 23 for(i = k+1; i < equ; i++) 24 if(fabs(a[i][col])-fabs(a[max_r][col]) > eps) 25 max_r = i; 26 27 if(max_r != k) 28 for(j = k; j < var+1; j++) 29 swap(a[k][j], a[max_r][j]); 30 31 if(fabs(a[k][col]) < eps) 32 { 33 k--; 34 continue; 35 } 36 for(i = k+1; i < equ; i++) 37 { 38 if(fabs(a[i][col]) > eps) 39 { 40 double t = a[i][col]/a[k][col]; 41 a[i][col] = 0.0; 42 43 for(j = col; j < var+1; j++) 44 a[i][j] -= a[k][j]*t; 45 } 46 } 47 } 48 for(i = var-1; i >= 0; i--) 49 { 50 if(fabs(a[i][i]) < eps) continue; 51 tmp = a[i][var]; 52 for(j = i+1; j < var; j++) 53 if(a[i][j] != 0) 54 tmp -= a[i][j]*x[j]; 55 56 //if(tmp%a[i][i] != 0) return -2; 57 x[i] = tmp/a[i][i]; 58 } 59 return 0; 60 } 61 int mht(int x1, int y1, int x2, int y2) 62 { 63 return abs(x1-x2)+abs(y1-y2); 64 } 65 66 int main() 67 { 68 int n, m, d; 69 int f = 0, i, j, k, l; 70 double b[maxn][maxn]; 71 while(cin>>m>>n>>d) 72 { 73 if(m==0&&n==0&&d==0) break; 74 if(f) 75 cout<<endl; 76 f = 1; 77 equ = n*m; 78 var = n*m; 79 memset(a, 0, sizeof(a)); 80 memset(x, 0, sizeof(x)); 81 for(i = 0; i < n; i++) 82 for(j = 0; j < m; j++) 83 cin>>b[i][j]; 84 for(i = 0; i < n; i++) 85 for(j = 0; j < m; j++) 86 for(k = 0; k < n; k++) 87 for(l = 0; l < m; l++) 88 if(mht(i, j, k, l) <= d) 89 { 90 a[i*m+j][k*m+l] = 1; 91 a[i*m+j][n*m] += b[i][j]; 92 } 93 Gauss(); 94 for(i = 0; i < n; i++) 95 { 96 for(j = 0; j < m; j++) 97 printf("%8.2lf", x[i*m+j]); 98 cout<<endl; 99 } 100 } 101 return 0; 102 }