描述:
對於一個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]);
}