高斯消元求解-HDU3359

来源:互联网 发布:占卜软件哪个好 编辑:程序博客网 时间:2024/06/05 09:28

https://vj.xtuacm.cf/contest/view.action?cid=115#problem/M

这个题目用的模板是直接求解方程式

题解及代码:
这是一个double精度的高斯消元,方程建立直接暴力枚举每个点与当前点的距离就可以了,注意一下题目中给出的输入 先是列数,后是行数

#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>#include <cstring>#include <vector>using namespace std;const int maxn=105;typedef double Matrix[maxn][maxn];const int inf=0x3f3f3f3f;Matrix A,S;void gauss(Matrix A,int n){    int i,j,k,r;    for(int 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 m,n,d;    bool first=false;    while(~scanf("%d%d%d",&n,&m,&d),n+m+d)    {        memset(A,0,sizeof(A));        for(int i=0; i<m; i++)            for(int j=0; j<n; j++)                scanf("%lf",&S[i][j]);        for(int i=0; i<m; i++)            for(int j=0; j<n; j++)            {                int cnt=0,nx,ny;                for(int dx=-d; dx<=d; dx++)                {                    nx=dx+i;                    if(nx<0||nx>=m)                        continue;                    int p=d-abs(dx);                    for(int dy=-p; dy<=p; dy++)                    {                        ny=dy+j;                        if(ny<0||ny>=n)                            continue;                        cnt++;                        A[i*n+j][nx*n+ny]=1;                    }                }                A[i*n+j][m*n]=cnt*S[i][j];            }        gauss(A,m*n);        if(!first)first=true;        else            printf("\n");        for(int i=0; i<m; i++)        {            for(int j=0; j<n; j++)            {                printf("%8.2f",A[i*n+j][m*n]);            }            printf("\n");        }    }    return 0;}
原创粉丝点击