【高斯消元】[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;
}