《算法竞赛入门经典》-读书笔记-蛇形填数

《算法竞赛入门经典》-读书笔记-蛇形填数

一开始在家里面有了一点思路,用两重循环。后来真正开始在纸上写代码的时候发现只要一重循环即可。 

#include < stdio.h >

int  main()
{

    
int  a[ 10 ][ 10 ];
    
int  dx[] = { 1 , 0 , - 1 , 0 };
    
int  dy[] = { 0 , - 1 , 0 , 1 };
    
int  value = 1 ;
    
int  i,j,n,x,y;

    scanf(
" %d " , & n);
    
for (i = 1 ;i <= n;i ++ )
        
for (j = 1 ;j <= n;j ++ )
            a[i][j]
= 0 ;

    
// 初始位置为(1,n),初始值为1
    x = 1 ;
    y
= n;
    i
= 0 ;
    a[x][y]
= value ++ ;

    
// 循环结束的条件为n*n个值已经赋完
     while (value <= n * n)
    {
        
// 按照当前的方向进行探测
        x += dx[i];
        y
+= dy[i];

        
// 如果符合条件,赋值
         if (x >= 1   &&  x <= &&  y >= 1   &&  y <= &&  a[x][y] == 0 )
            a[x][y]
= value ++ ;
        
// 如果不符合条件,把坐标退回,方向进行逆时针旋转
         else
        {
            x
-= dx[i];
            y
-= dy[i];
            i
= (i + 1 ) % 4 ;
        }
        printf(
" \nvalue=%d\n " ,value);
    }

    
for (i = 1 ;i <= n;i ++ )
    {
        
for (j = 1 ;j <= n;j ++ )
            printf(
" %d  " ,a[i][j]);
        printf(
" \n " );
    }

    
return   0 ;

}

 后来看到书上的sample代码,我觉着我的代码显然要好很多:-)

你可能感兴趣的:(《算法竞赛入门经典》-读书笔记-蛇形填数)