【高斯消元】[HDU 3359][POJ3999][UVALive4741]Kind of a Blur

题目
题意很简单;
根据d列出一个n*m元一次方程组即可,高斯消元模板题。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define MAXN 10
#define EPS 1e-11
using namespace std;
int n,m,d,var,equ;
double a[MAXN*MAXN+2][MAXN*MAXN+2],mat[MAXN+2][MAXN+2];
void read(){
    int i,j,ii,jj;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%lf",&mat[i][j]);
    var=equ=n*m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            for(ii=1;ii<=n;ii++)
                for(jj=1;jj<=m;jj++)
                    if(abs(i-ii)+abs(j-jj)<=d)
                        a[(i-1)*m+j][(ii-1)*m+jj]++,a[(i-1)*m+j][var+1]++;
            a[(i-1)*m+j][var+1]*=mat[i][j];
        }
}
void gauss_jordan(){
    int i,j,row,col,mxr;
    for(row=col=1;row<=equ&&col<=var;row++,col++){
        mxr=row;
        for(i=row+1;i<=equ;i++)
            if(fabs(a[i][col])>fabs(a[mxr][col]))
                mxr=i;
        if(mxr!=row)
            swap(a[mxr],a[row]);
        if(fabs(a[row][col])<EPS){
            row--;
            continue;
        }
        for(i=1;i<=equ;i++)
            if(i!=row&&fabs(a[i][col])>EPS)
                for(j=var+1;j>=col;j--)
                    a[i][j]-=a[row][j]/a[row][col]*a[i][col];
    }
}
void print(){
    int i,j;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++)
            printf("%8.2lf",a[(i-1)*m+j][var+1]/a[(i-1)*m+j][(i-1)*m+j]);
        printf("\n");
    }
}
int main()
{
    int cnt=0;
    while(~scanf("%d%d%d",&m,&n,&d)&&m&&n){
        if(cnt++)
            printf("\n");
        memset(a,0,sizeof a);
        memset(mat,0,sizeof mat);
        read();
        gauss_jordan();
        print();
    }
    return 0;
}
posted @ 2016-01-28 10:51  outer_form  阅读(167)  评论(0编辑  收藏  举报