HDU

来源:互联网 发布:淘宝管控记录中的商品 编辑:程序博客网 时间:2024/06/14 23:10

题意

输入 n m d, 以及一个 n * m 的矩阵。表示 该矩阵是有一个“原矩阵”通过以下变换得到的:
对于矩阵上的每个点,输入矩阵的值 = (原矩阵到该点哈密顿距离 <= d 的点)的距离的平均值。
要求输出原矩阵。

思路

Guass消元模板题

链接

https://vjudge.net/contest/176567#problem/I

代码

#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>#include<cmath>using namespace std;const int maxn = 205;const double eps = 1e-8;double s[20][20], a[maxn][maxn], x[maxn];int equ, var;int Guass(){    int i, j, k, col, max_r;    for(k= 0, col= 0; k< equ && col< var; k++, col++)    {        max_r = k;        for(int i= k+1; i< equ; i++)            if(fabs(a[i][col]) > fabs(a[max_r][col]))                max_r = i;        if(fabs(a[max_r][col]) < eps) return 0;        if(k != max_r)        {            for(int j= col; j< var; j++)                swap(a[k][j], a[max_r][j]);            swap(x[k], x[max_r]);        }        x[k] /= a[k][col];        for(j= col+1; j< var; j++)            a[k][j] /= a[k][col];        a[k][col] = 1;        for(i= 0; i< equ; i++)            if(i != k)            {                x[i] -= x[k] * a[i][k];                for(j= col+1; j< var; j++)                    a[i][j] -= a[k][j] * a[i][col];                a[i][col] = 0;            }    }    return 1;}int main(){    //freopen("in.txt", "r", stdin);    int d, tt = 0, n, m;    while(1)    {        scanf("%d %d %d", &m, &n, &d);        if(n == 0 && m == 0 && d == 0) break;        if(tt ++) puts("");        for(int i= 0; i< n; i++)            for(int j= 0; j< m; j++)                scanf("%lf", &s[i][j]);        equ = var = n * m;        memset(a, 0, sizeof a);        for(int i= 0; i< n; i++)            for(int j= 0; j< m; j++)        {            int cnt = 0;            for(int k= 0; k< n; k++)                for(int p= 0; p< m; p++)                    if(abs(i - k) + abs(j - p) <= d)                        a[i*m+j][k*m+p] = 1, cnt ++;            x[i*m+j] = cnt * s[i][j];        }        Guass();        for(int i= 0; i< n; i++)        {            for(int j= 0; j< m; j++)                printf("%8.2f", x[i*m+j]);            puts("");        }    }    return 0;}