Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
#include<bits/stdc++.h> using namespace std; #define ll unsigned long long #define pi (4*atan(1.0)) #define eps 1e-14 #define bug(x) cout<<"bug"<<x<<endl; const int N=2e5+10,M=1e6+10,inf=1e9+10; const ll INF=1e18+10,mod=2147493647; int n,m; double a[110][110], b[1002], x[1002]; double mp[110][110]; int Gauss(int N,int M)///M个方程,N个未知数 { int mark = 1; for(int i = 1; i <= N && mark <= N; mark++) { int n = i; for(int j = i + 1; j <= M; j++) if(fabs(a[j][mark]) > fabs(a[n][mark])) n = j; if(n != i) { for(int j = mark; j <= N; j++) swap(a[i][j], a[n][j]); swap(b[i], b[n]); } if(fabs(a[i][mark]) < eps) continue; for(int j = i + 1; j <= M; j++) { if(fabs(a[j][mark]) < eps) continue; double temp = a[j][mark] / a[i][mark]; for(int k = mark; k <= N; k++) a[j][k] -= (a[i][k] * temp); b[j] -= (b[i] * temp); } i++; } int num = 0; for(int i = M; i >= 1; i--) { bool status = false; for(int j = N; j >= 1; j--) { if(fabs(a[i][j]) > eps) { status = true; break; } } if(!status && fabs(b[i]) > eps) return 0; if(status) num++; for(int j = N; j > i; j--) b[i] -= a[i][j] * x[j]; x[i] = b[i] / a[i][i]; } if(num < N) { return -1; } return 1; } int num; int getnum(int x,int y) { return (x-1)*m+y; } int main() { int d; int fh=0; while(~scanf("%d%d%d",&m,&n,&d)&&(n+m+d)) { if(fh++)printf("\n"); memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) scanf("%lf",&mp[i][j]); } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { num=0; for(int k=1;k<=n;k++) { for(int l=1;l<=m;l++) { if(abs(k-i)+abs(l-j)<=d) { a[getnum(i,j)][getnum(k,l)]=1; num++; } } } b[getnum(i,j)]=num*mp[i][j]; } } Gauss(n*m,n*m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) printf("%8.2f",x[getnum(i,j)]); printf("\n"); } } return 0; }
原文:http://www.cnblogs.com/jhz033/p/6269709.html