蛇形数组就是按如图的顺序依次赋值
这次参加笔试,有这个题的算法,当时想到了一种很简洁的算法。算法的思路就是,每赋值一次,用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; } |