蛇形数组

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

 这次参加笔试,有这个题的算法,当时想到了一种很简洁的算法。算法的思路就是,每赋值一次,用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<stdio.h>   
#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<N && !a[i][j+1])
                       {
                              j++    ;
                              break ;
                       }
                      flag  = DOWN ;
            }
           case DOWN:
          {
                        if ( i+1<N && !a[i+1][j])
                        {
                                  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<N && !a[i][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;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值