HDU 3359 http://acm.hdu.edu.cn/showproblem.php?pid=3359
高斯消元基础题 模板题吧
参考黑书上的代码写的
#include<stdio.h> #include<iostream> #include<string> #include<stdlib.h> #include<string.h> #include<math.h> using namespace std; typedef double Matrix[105][105]; int mht(int i,int j,int m,int n){ return abs(i-m)+abs(j-n); } void gauss(Matrix A ,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(j = n; j >= i; j--){ for(k = i+1; k < n; ++k) A[k][j] -= A[k][i]/A[i][i] * 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(){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); Matrix g; double map[12][12]; int pos[120][120]; int r,c,d; bool is_first=true; while(scanf("%d%d%d",&c,&r,&d),r||c||d){ if(!is_first) printf("\n"); is_first=false; int i,j; int cnt=0; for(i=0;i<r;i++){ for(j=0;j<c;j++){ pos[i][j]=cnt++; scanf("%lf",&map[i][j]); } } memset(g,0,sizeof(g)); int m,n; for(i=0;i<r;i++){ for(j=0;j<c;j++){ for(m=0;m<r;m++){ for(n=0;n<c;n++){ if( mht(i,j,m,n)<=d ){ g[ pos[i][j] ][ pos[m][n] ]=1; g[ pos[i][j] ][cnt] += map[i][j]; } } } } } gauss(g,cnt); for(i=0;i<cnt;i++){ printf("%8.2lf",g[i][cnt]); if( (i+1)%c == 0 ) putchar(10); } } return 0; }