hdu 3359 Kind of a Blur

高斯消元,直接套模板

#include <CSTDIO>
#include <QUEUE>
using namespace std;

// hdu 3359
/*
	高斯消元 求期望
	也是数字图像处理的一种应用
*/
const int MAXN = 110;
const double _inf = 1e-9;
double a[MAXN][MAXN], x[MAXN]; // 方程左边的矩阵和等式右边的值, x存放最后结果
int equ, val;	// 方程数 未知数个数
inline double mabs(double _X){return _X<0?-_X:_X;}
int gauss()
{
	int i,j,k,col,max_r;
    for(k=0,col=0;k<equ&&col<val;k++,col++)
    {
        max_r=k;
        for(i=k+1;i<equ;i++)
			if(mabs(a[i][col])>mabs(a[max_r][col]))
				max_r=i;
			if(mabs(a[max_r][col])<_inf) return 0;
			if(k!=max_r)
			{
				for(j=col;j<val;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<val;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<val;j++)a[i][j]-=a[k][j]*a[i][col];
					a[i][col]=0;
				}
    }
    return 1;
}
int w, h, d;
double data[MAXN][MAXN];
int main()   
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif
	int i, j, k, f = 1;
	while (scanf("%d%d%d", &w, &h, &d) == 3 && (w+h+d))
	{
		
		if (!f)
			puts("");
		else
			f = 0;
		for (i = 0; i< h; ++i)
		{
			for (j = 0; j< w; ++j)
			{
				scanf("%lf", &data[i][j]);
			}
		}
		equ = val = h*w;
		memset(a, 0, sizeof a);
		memset(x, 0, sizeof x);
		for (i = 0; i<h; ++i)
		{
			for (j = 0; j< w; ++j)
			{
				k = i*w+j;
				x[k] = 0.0;
				int cnt = 0, aa, bb;
				for ( aa = -d; aa<= 0; ++aa)
				{
					for ( bb = -aa-d; bb<= aa+d; ++bb)
					{
						if ((i+aa)>=0 && (i+aa)<h && (j+bb)>=0 && (j+bb)<w)
						{
							++cnt;
							a[k][(i+aa)*w+(j+bb)] = 1.0;
						}
					}
				}
				for ( aa = 1; aa<= d; ++aa)
				{
					for ( bb = aa-d; bb<= -aa+d; ++bb)
					{
						if ((i+aa)>=0 && (i+aa)<h && (j+bb)>=0 && (j+bb)<w)
						{
							++cnt;
							a[k][(i+aa)*w+(j+bb)] = 1.0;
						}
					}
				}
				x[k] = data[i][j]*cnt;
			}
		}
		gauss();
		for (i = 0, k = 0; i< h; ++i)
		{
			for (j = 0; j< w; ++j, ++k)
			{
				printf("%8.2lf", x[k]);
			}
			puts("");
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值