Posted on 2010-10-03 23:19
acronix 阅读(372)
评论(0) 编辑 收藏 引用 所属分类:
hzshuai解题报告 、
hzshuai收集的模板
其他的都不多说了,列出A*X=B方程,找出系数A矩阵和解B,
教训:查了个把小时的错,计算[i,j]为宽w,高h 中第几个数时弄错了,应该每行 w 个。
收获:rt,还有知道了swap( ,)这个交换两变量数据的函数
#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <cmath>
using namespace std;
const int M = 105;
double a[M][M],b[M];
double map[15][15];
int w,h,d,len;
/***********************************************************/
/*******len为解的个数,a[][]*X[] = b[],解在b【】中*****************************************************/
void Guass()
{
int id,i,j,k;
double max,temp;
k = 1;
while (k <= len)
{
max = fabs(a[k][k]);
id = k;
//change the max!!!
for (i = k+1; i <= len; i++)
{
if (max < fabs(a[i][k]))
{
max = fabs(a[i][k]);
id = i;
}
}
if (k != id)
{
//新发现,有swap交换函数能用
swap(b[id],b[k]);
for (i = 1; i <= len; i++)
swap(a[id][i],a[k][i]);
}
//to gauss
b[k] /= a[k][k];
temp = a[k][k];
for (i = k; i <= len; i++)
{
a[k][i] /= temp;
}
for (i = 1; i <= len; i++)
if (i != k)
{
temp = a[i][k];
b[i] -= b[k]*temp;
for (j = k; j <= len; j++)
a[i][j] -= a[k][j]*temp;
}
k ++;
}
}
/*************************************************************************/
int main()
{
// freopen("blur.in","r",stdin);
int i,j,p,q,id,count,sum,cas = 1,cnt;
while (scanf("%d %d %d",&w,&h,&d))
{
if (w == 0 && h == 0 && d == 0)
break;
else if (cas != 1)
printf("\n");
cas ++;
len = w * h;
for (i = 1; i <= h; i++)
for (j = 1; j <= w; j ++)
scanf("%lf",&map[i][j]);
for (i = 1; i <= len; i++)
for (j = 1; j <= len; j++)
a[i][j] = 0.0;
for (i = 1; i <= h; i++)
for (j = 1; j <= w; j++)
{
cnt = (i-1) * w + j;
b[cnt] = map[i][j];
count = 0;
for (p = i - d; p <= i + d; p ++)
for (q = j - d; q <= j + d ; q ++)
{
if (abs(p-i) + abs(q-j) <= d && p >= 1 && p <= h && q >= 1 && q <= w)
{
id = (p-1)*w + q;
a[cnt][id] = 1;
count ++;
}
}
b[cnt] *= count;
}
Guass();
for (i = 1; i <= len; i++)
{
printf("%8.2lf",b[i]);
if (i % w == 0)
printf("\n");
}
}
// while (1) ;
return 0;
}