【高斯消元】[HDU3359]Kind of a Blur

高斯消元模板题目, 注意题目有坑n=0, m=0就退出

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MAXN = 100;
const double eps = 1e-11;
double mabs(double u){return u>0?u:-u;}
struct Matrix{
    double Ma[MAXN+10][MAXN+11];
    int n;
    void solve(){
        int m = n+1;
        for(int i=1;i<=n;i++){
            int Maxp = i;
            for(int j=i+1;j<=n;j++)
                if(mabs(Ma[j][i]) > mabs(Ma[Maxp][i]))
                    Maxp = j;
            if(Maxp != i)
                swap(Ma[Maxp], Ma[i]);
            for(int j=1;j<=n;j++){
                if(j != i && mabs(Ma[j][i]) >= eps){
                    double bl = Ma[j][i] / Ma[i][i];
                    for(int k=1;k<=m;k++)
                        Ma[j][k] -= bl * Ma[i][k];
                }
            }
        }
    }
}M, Ym;
int ma(int u){return u>0?u:-u;}
int Dis(int a, int b, int c, int d){
    return ma(a-c)+ma(b-d);
}
int main(){
    int W, H, D;
    bool fir = false;
    while(~scanf("%d%d%d", &W, &H, &D) && W && H){
        if(fir) printf("\n");
        else fir = true;
        memset(M.Ma, 0, sizeof M.Ma);
        M.n = W*H;
        for(int i=1;i<=H;i++)
            for(int j=1;j<=W;j++)
                scanf("%lf", &Ym.Ma[i][j]);
        for(int i=1;i<=H;i++){
            for(int j=1;j<=W;j++){
                int cnt = 0;
                for(int ip=1;ip<=H;ip++){
                    for(int jp=1;jp<=W;jp++){
                        if(Dis(i, j, ip, jp) <= D)
                            M.Ma[(i-1)*W+j][(ip-1)*W+jp]++, cnt++;
                    }
                }
                M.Ma[(i-1)*W+j][W*H+1]=cnt*Ym.Ma[i][j];
            }
        }
        M.solve();
        for(int i=1;i<=H;i++){
            for(int j=1;j<=W;j++){
                printf("%8.2lf", M.Ma[(i-1)*W+j][H*W+1]/M.Ma[(i-1)*W+j][(i-1)*W+j]);
            }
            printf("\n");
        }
    }

    return 0;
}
/*
9 4 10
2 5 8
3 4 6
*/

posted on 2016-01-28 10:12  JeremyGuo  阅读(144)  评论(0编辑  收藏  举报

导航