隨筆:把1,2,3…n*n 的數字按照順時針螺旋的形式填入數字矩陣


從鍵盤輸入一個整數(1~20)

則以該數字爲矩陣的大小,把1,2,3…n*n 的數字按照順時針螺旋的形式填入其中。例如:

輸入數字2,則程序輸出:

1 2

4 3

輸入數字3,則程序輸出:

1 2 3

8 9 4

7 6 5

輸入數字4, 則程序輸出:

1 2  3 4

12 13 14 5

11 16 15 6

10  9 8  7


分析:通過輸出結果,如果將數據存在一個二維數組中,可以看出這樣一種規律,數字的填充順序爲:

1.行座標不變列座標遞增,當列座標超出最大範圍或者要填充的位置已經被填充過,則跳轉到步驟2,

2.行座標遞增列座標不變,當行座標超過最大範圍或者要填充的位置已經被填充過,則跳轉到步驟3

3.行座標不變列座標遞減,當列座標小於最小範圍或者要填充的位置已經被填充過,則跳轉到步驟4

4.行座標遞減列座標不變,當行座標小於最小範圍或者要填充的位置已經被填充過,則跳轉到步驟1

只要循環執行以上四個步驟,每執行一個步驟則填充一個數據,直到全部數據填充完則結束

對應java代碼如下:

public class FillNumber
{
	
	public static void main(String[] args)
	{
		int n=5;//測試數據
		int[][] numberMatrix=getNumberMatrix(n);
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				System.out.printf("%-4d",numberMatrix[i][j]);
			}
			System.out.println();
		}
	}
	public static int[][] getNumberMatrix(int n){
		
		int[][] result=new int[n][n];
		
		int number=1; //填充二維數組的數字
		int i=0;	//行下標
		int j=0;	//列下標
		//代表如何填充數字,1表示從左到右填充,2表示從上到下填充,3表示從右到左填充,4表示下到上填充
		char type=1; 
		while(number<=n*n){
			result[i][j]=number;
			if(type==1){
				j++;
				if(j==n||result[i][j]!=0){
					type=2;
					i++;
					j--;
				}
			}else if(type==2){
				i++;
				if(i==n||result[i][j]!=0){
					type=3;
					j--;
					i--;
				}
			}else if(type==3){
				j--;
				if(j==-1||result[i][j]!=0){
					type=4;
					j++;
					i--;
				}
			}else{
				i--;
				if(i==0||result[i][j]!=0){
					type=1;
					i++;
					j++;
				}
			}
			number++;
		}
		return result;
	}
}


輸出結果:

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




發佈了39 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章