打印螺旋數組

描述:

對於一個N*N的數組,輸入一個小於 N*N的數n,螺旋打印該數組。例如:一個5*5的數組,輸入25,打印如下圖形:

 1  2  3  4  5 
16 17 18 19  6 
15 24 25 20  7 
14 23 22 21  8 
13 12 11 10  9 

實現思路:

定義四個方向:

上邊->x不變,y+1;

右邊->x+1,y不變;

下邊->x不變,y-1;

左邊->x-1,y不變。

源碼實現如下:

#define N 5
void print_spiral_array()
{
    //控制方向
    int dd = 0;
    int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    //數組座標
    int x = 0,y = 0;
    int xx = 0,yy = 0;
    //賦值數據
    int num = 1,n = 0;
    int buf[N][N] = {};
    
    scanf("%d", &n);
    
    while(1)
    {
        buf[x][y]=num++;
        
        if ( num>n || num>N*N )
        //循環跳出條件(所有數據賦值完成)
            break;
        
        //用當前方向計算下一個位置
        xx = x; xx += dir[dd][0];
        yy = y; yy += dir[dd][1];
        
        //當超出數組範圍或遇到已經賦值過的元素時改變方向
        while(xx<0 || xx>=N || yy<0 || yy>=N || buf[xx][yy])
        {
            dd++;
            if ( dd >= N - 1 )
                dd = 0;
            
            xx = x; xx += dir[dd][0];
            yy = y; yy += dir[dd][1];
        }
        x = xx;
        y = yy;
    }
    
    for (int i = 0;i < N;i++,printf("\n") )
        for (int j = 0;j < N;j++ )
            printf("%2d ",buf[i][j]);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章