首页 > 代码库 > HDU3359 Kind of a Blur(高斯消元)
HDU3359 Kind of a Blur(高斯消元)
建立方程后消元
#include<cstdio>#include<iostream>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<vector>#include<cmath>#include<utility>using namespace std;typedef long long LL;const int N = 108, INF = 0x3F3F3F3F;const double eps = 1e-8;double f[N][N];bool inf[N];template<typename T>void gauss_jordan(T A[N][N], int n){ for(int i = 0; i < n; i++){ //选择一行r与第i行交换 int r = i; for(int j = i + 1; j < n; j++){ if(abs(A[j][i]) > abs(A[r][i])){ r = j; } } if(abs(A[r][i]) < eps){ continue; } if(r != i){ for(int j = 0; j <= n; j++){ swap(A[r][j], A[i][j]); } } for(int k = 0; k < n; k++){ if(k != i){ for(int j = n; j >= i; j--){ A[k][j] -= A[k][i] / A[i][i] * A[i][j]; } } } }}int main(){ bool flag = 0; int h, w, d; while(scanf("%d %d %d", &w, &h, &d), w || h || d){ memset(f, 0, sizeof(f)); for(int i = 0; i < h; i++){ for(int j = 0; j < w; j++){ double t; scanf("%lf", &t); int u = i * w + j; f[u][w * h] = t; int cnt = 0; for(int x = max(0, i - d) ; x <= min(h - 1, i + d); x++){ for(int y = max(0, j - d) ; y <= min(w - 1, j + d); y++){ if(abs(x - i) + abs(y - j) <= d){ cnt ++; } } } for(int x = max(0, i - d) ; x <= min(h - 1, i + d); x++){ for(int y = max(0, j - d) ; y <= min(w - 1, j + d); y++){ if(abs(x - i) + abs(y - j) <= d){ int v = x * w + y; f[u][v] = 1.0 / (double)cnt; } } } } } gauss_jordan(f, w * h); if(flag){ printf("\n"); } flag = 1; for(int i = 0; i < h; i++){ for(int j = 0; j < w; j++){ printf("%8.2f", f[i * w + j][w * h] / f[i * w + j][i * w + j]); } printf("\n"); } } return 0;}
HDU3359 Kind of a Blur(高斯消元)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。