蛇形数组

      蛇形数组就是按如图的顺序依次赋值

 这次参加笔试,有这个题的算法,当时想到了一种很简洁的算法。算法的思路就是,每赋值一次,用flag标识来判断下一次赋值的位置,flag标记按右,下,左,上四个方向交替进行直到全部赋值完。伪码表示如下:

n  = 1  , i = 0 , j = 0 , flag = RIGHT ;
while ( TRUE  ) 
{
    a[i][j]  = n ++ ;
    if ( n > N*N )
    {
     break ;
    }
    switch ( flag )
    {
     case RIGHT:            //添加代码
     case DOWN:             //添加代码
     case LEFT:             //添加代码
     case UP:               //添加代码
     default :
            break ;
    }
}

源程序如下,特别注意源代码switch分支没有加break语句:



#include   
#define N           10
#define RIGHT   1
#define  DOWN  2
#define LEFT      3
#define UP         4
int  a[N][N]={0} ;
int main()  
{  
int i = 0 , j = 0  , flag  = RIGHT, n = 1  ;
    while( 1 ) 
    {
          a[i][j] = n ++ ;
         if ( n > N*N )
         {
                 break ;
         }
         switch ( flag )
        {
            case RIGHT:
            {
                       if ( j+1                        {
                              j++    ;
                              break ;
                       }
                      flag  = DOWN ;
            }
           case DOWN:
          {
                        if ( i+1                         {
                                  i++    ;
                                  break ;
                        }
                       flag  = LEFT ;
           }
          case LEFT:
         {
                       if ( j -1 >= 0  && !a[i][j-1])
                      {
                               j--   ;
                              break ;
                      }
                     flag  = UP ;
          }
          case UP:
          {
                       if ( i -1 >= 0  && !a[i-1][j])
                       {
                                i--   ;
                              break ;
                       }
                      flag = RIGHT ;
          }
         default:
         {
                       if ( j+1                        {
                               j++    ;
                              break ;
                       }
         }
     }
}
    for ( i = 0 ; i < N ; i ++ )
    {
                printf("\n");
                 for ( j = 0 ; j < N ; j ++ )
                 {
                         printf("%d\t",a[i][j]);
                 }
     }
    return 0;  
}  

你可能感兴趣的:(算法及数据结构)