1. 程式人生 > >用二維陣列列印螺旋方陣和螺旋矩陣

用二維陣列列印螺旋方陣和螺旋矩陣

————————————————————————————————————————————————————————————————

螺旋方陣,形如:

1  2  3 4 5

1617 1819 6

1524 2520 7

1423 2221 8

1312 1110 9

它是從陣列的第一行開始,順時針旋轉數列,直到陣列中心,

當然,還有並不規則的螺旋矩陣:

 1 2  3 4 5 6 7

2021 22232425 8

1932 33343526 9

1831 3029282710

1716 1514131211

對於這樣的陣列,我們從不規則的矩陣入手,把方陣看作是特殊的矩陣。

-------我們可以看到,矩陣中的數字是按照 ”線“ 的方向排列的。“線”在拐彎,數字跟著拐彎。所以,我們從這條會拐彎的“線”入手。

怎樣去找其中的規律呢?

每一行,每一列,貌似都只有一部分有規律。但是如果把有規律的部分劃出來,我們會發現點什麼。


仔細看看,,是不是圖形中的每一塊都有規律了。

當然,如果是不規則矩陣,我們也可以找其中的規律:


規則的螺旋方陣也可以找到這種方法,如圖:

大笑大笑大笑大笑大笑

因此,我們就用上圖7*7的矩陣所示的分割方法,把每個要列印的矩陣分成5部分。

第一部分是上邊的三角區域;

第二部分是右邊的三角區域;

第三部分是下邊的三角區域;

第四部分是左邊的三角區域;

第五部分是中間的小區域,當然,如果是偶數行的矩陣,中間的區域就不存在了。

我們發現,數字的“線”就是按照我們所分的區域走的。第一部分、第二部分、第三部分、第四部分、然後迴圈,一、二、三、四,最後可能走到第五部分結束。

而且,第五部分只能從左往右走。

下面分析一下,這個二維陣列程式碼的寫法。

設定每一行為一個length為n的一維陣列,m個一維陣列組成了二維陣列;這樣就形成了 矩陣。

第一部分的二維陣列規則:array[x][y]  x不變,y改變。

第二部分的二維陣列規則:array[x][y]  y不變,x改變。

第三部分的二維陣列規則:array[x][y]  x不變,y倒序改變。

第四部分的二維陣列規則:array[x][y]  y不變,x倒序改變。

這條數字“線”,我們定義一個變數key,每一次往數組裡賦值,就讓key自增一次。

OK ! 附上程式碼:

//輸出螺旋距陣。
class Luo
{
	public static void main(String [] args)
	{
		int m=7,n=7;  			//mn)
			arr=new int [n] [m];
		else
			arr=new int [m] [n];
		printArr(arr,m,n);
	}

	public static void printArr(int [] [] arr,int a,int b)    //傳值時,保證了a<=b。
	{
		int k=1;  		//定義一個變數,形成數字“線”。
	
		for (int x=0;x=x;y--)
			{
				arr[a-x-1][y]=k++;
			} 
	
			/*第四部分:左邊三角區域:
			 [5][0] , [4][0] , [3][0] , [2][0] , [1][0]
			 [4][1] , [3][1] , [2][1]
			 [3][2]
			 可以總結規律為arr[m-x-2~x+1][x]*/
			for (int y=x+1;y

此程式碼可以打印出任意長寬的螺旋矩陣。如果長小於寬,可以自動置換長和寬。

如有問題歡迎大家討論。