hdu3359 kind of blur高斯消元,线性代数知识的第一次运用

其他的都不多说了,列出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 ;
}

你可能感兴趣的:(hdu3359 kind of blur高斯消元,线性代数知识的第一次运用)