const int maxn = 108 ;
typedef double Matrix[maxn][maxn] ;
Matrix A ;
double a[maxn][maxn] , ans[maxn][maxn] ;
int H , W ;
int to(int x , int y){
return W * x + y ;
}
void gauss_elimination(int n){
int i , j , k , r ;
for(i = 0 ; i < n ; i++){
r = i ;
for(j = i+1 ; j < n ; j++){
if(fabs(A[j][i]) > fabs(A[r][i])) r = j ;
}
if(r != i){
for(j = 0 ; j <= n ; j++) swap(A[r][j] , A[i][j]) ;
}
for(k = i+1 ; k < n ; k++){
double f = A[k][i] / A[i][i] ;
for(j = i ; j <= n ; j++) A[k][j] -= f * A[i][j] ;
}
}
for(i = n-1 ; i >= 0 ; i--){
for(j = i+1 ; j < n ; j++) A[i][n] -= A[j][n] * A[i][j] ;
A[i][n] /= A[i][i] ;
}
}
int main(){
int d , i , j , di , dj , T = 0 ;
while(cin>>W>>H>>d){
if(W == 0 && H == 0 && d == 0) break ;
for(i = 0 ; i < H ; i++)
for(j = 0 ; j < W ; j++) scanf("%lf" , &a[i][j]) ;
memset(A , 0 , sizeof(A)) ;
for(i = 0 ; i < H ; i++){
for(j = 0 ; j < W ; j++){
int u = to(i , j) ;
int k = 0 ;
for(di = -d ; di <= d ; di++){
for(dj = -d ; dj <= d ; dj++){
int x = i + di ;
int y = j + dj ;
if(0 <= x && x < H && 0 <= y && y < W && abs(x-i) + abs(y-j) <= d){
k++ ;
int v = to(x , y) ;
A[u][v] = 1 ;
}
}
}
A[u][H*W] = k * a[i][j] ;
}
}
gauss_elimination(H*W) ;
if(T++ > 0) puts("") ;
for(i = 0 ; i < H ; i++){
for(j = 0 ; j < W ; j++){
ans[i][j] = A[to(i,j)][H*W] ;
printf("%8.2lf" , ans[i][j]) ;
}
puts("") ;
}
}
return 0 ;
}
HDU3359
最新推荐文章于 2018-08-14 16:18:17 发布