hdu 3359 Kind of a Blur (高斯消元 浮点型)

题目链接

题意:

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 }

 

posted @ 2014-08-24 21:21  水门  阅读(258)  评论(0编辑  收藏  举报