当前位置: 代码迷 >> 综合 >> 【高斯消元】HDU3359
  详细解决方案

【高斯消元】HDU3359

热度:109   发布时间:2023-09-27 09:24:04.0

HDU3359
题意:有一个w*h的矩阵A,将每一个值与周围曼哈顿距离不超过d的原矩阵中的值取平均值,得到新的矩阵B(参见样例),给出矩阵B,求矩阵A(保证有解)
分析:模板题,每个位置列一个w*h元一次的方程,求解即可

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define SF scanf
#define PF printf
#define MAXN 110
#define MAXSIZE 11
#define EPS 1e-11
using namespace std;
double a[MAXN][MAXN],mat[MAXSIZE][MAXSIZE];
int n,m,f[MAXN],w,h,d;
void init(){memset(mat,0,sizeof mat);memset(a,0,sizeof a);for(int i=0;i<w;i++)for(int j=0;j<h;j++)SF("%lf",&mat[i][j]);for(int i=0;i<w;i++)for(int j=0;j<h;j++){for(int ii=0;ii<w;ii++)for(int jj=0;jj<h;jj++)if(fabs(i-ii)+fabs(j-jj)<=d)a[i*h+j][ii*h+jj]++,a[i*h+j][w*h+1]++;a[i*h+j][w*h+1]*=mat[i][j];}n=w*h;m=w*h+1;
}
void gauss(){int r,c,maxr;for(r=0,c=0;r<n&&c<m;r++,c++){maxr=r;for(int i=r+1;i<n;i++)if(fabs(a[i][c])>fabs(a[maxr][c]))maxr=i;if(fabs(a[maxr][c])<EPS){r--;continue;}if(maxr!=r)for(int i=c;i<=m;i++)swap(a[r][i],a[maxr][i]);for(int i=0;i<n;i++)if(i!=r&&fabs(a[i][c])>EPS)for(int j=m;j>=c;j--)a[i][j]-=a[r][j]/a[r][c]*a[i][c];}
}
void print(){for(int i=0;i<w;i++){for(int j=0;j<h;j++)PF("%8.2lf",a[i*h+j][m]/a[i*h+j][i*h+j]);PF("\n");}
}
int main(){SF("%d%d%d",&h,&w,&d);int cnt=0;while(h||w||d){init();gauss();if(cnt++)PF("\n");print();SF("%d%d%d",&h,&w,&d);}
}