螺旋矩陣

iamzxf發表於2014-11-10

下面是一個5×5的螺旋方陣,試程式設計列印出此形式的n×n(n<10)階的方陣。

    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 


    此題的關鍵在於如何有效控制填充數的位置,從題中可以發現,填充數是按著“先向右,再向下,再向左,再向上”的順序進行變化的,不妨將其稱為方向。如果方向知道了,則下一個需要填充的位置也就知道了。因此,這個題的關鍵在於有效控制方向。方向的變化也需要根據填充數的位置進行,並應該與已經填充的數字避免衝突。因此,可以首先將陣列中所有位置賦初值0,隨著填充的進行,如果數不為0,則說明這個位置已經填上數字,因此方向應該發生改變。

    參考程式碼如下:

#include <stdio.h>
#define N 5
int main()
{
	int a[N][N]={0};
	int direction=1;
	int i,j;
	int x,y;

	x=0;y=0; //initial position

	for(i=1;i<=N*N;i++)
	{
		a[x][y]=i;
		switch(direction)
		{
		case 1: if(a[x][y+1]||y==N-1)
					direction=2;
			break;
		case 2: if(a[x+1][y]||x==N-1)
					direction=3;
			break;
		case 3: if(a[x][y-1]||y==0)
					direction=4;
			break;
		case 4: if(a[x-1][y]||x==0)
					direction=1;
			break;
		}

		switch(direction){
		case 1: y++; break;
		case 2: x++; break;
		case 3: y--; break;
		case 4: x--; break;
		}
	}

	for(i=0;i<N;i++){
		for(j=0;j<N;j++)
			printf("%4d",a[i][j]);
		printf("\n");
	}

	return 0;
}




相關文章