posts - 64, comments - 4, trackbacks - 0, articles - 0
其他的都不多说了,列出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)*+ 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;
}


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理