Java回形矩陣(數組元素賦值問題)

問題:java

從鍵盤讀入一個數,打印出如下特色的矩陣。

如輸入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到n逐個賦值,且每行(列)都爲n個數。code

想法

以一個6*6的回行矩陣爲例,將每一個數視爲一個點,按照順序依次鏈接,獲得一個「回行迷宮」。按照其規律,咱們就是要沿着迷宮牆壁(即圖示連線)走,每走一步,賦一個值,走到必定步數後就90°轉向換個方向繼續走。blog

回行矩陣示例圖-1

Question:

那麼,要走多少步呢?這個步長是否也有規律可循?還有,轉向時的方向該如何判斷?...input

仔細揣摩,發現矩陣走完每一面牆壁的步長依次是五、五、五、四、四、三、三、二、二、一、1,走完一個步長即轉向,且只有上、下、左、右四個方向。it

若拋開第一面牆壁,則剩餘的牆壁中,每兩個牆壁具備相同的長度,且互相垂直,同時每走完兩面牆壁,步長減1。故考慮第一面牆壁單獨處理,剩餘牆壁按相同規則處理。io

回行矩陣示例圖-2

試着鏈接副對角線上的數,則可獲得5個從大到小、以虛線爲底邊的等腰直角三角形(暫且無論第一行),且5個等腰直角三角形的腰長依次爲五、四、三、二、1 (接下來咱們就以一個三角形爲基準來執行操做)。class

先將第一行單獨賦值,而後就是走出5個等腰直角三角形。變量

站在小人位置,第一個三角形腰長爲5(初始方向向下),接着每走完一個腰長就90°轉向,每走完兩個腰長(即走出一個等腰直角三角形),將腰長-1。循環

轉向週期爲4,按照向下、向左、向上、向右的順序,以此往復。

回行矩陣示例圖-3

總結

  • 對於一個n*n的回行矩陣,將其每一個數視爲一個點,按賦值順序依次鏈接起來;
  • 鏈接副對角線上的點,則可獲得 n-1 個等腰直角三角形以及額外的一條直線 (即第一行); 這 n-1 個等腰直角三角形的腰長逐個遞減1;
  • 第一行單獨賦值。走三角形時的初始方向向下,步長爲 n-1 ,走完一個步長轉向,走完兩個步長除了轉向還要將步長減1
  • 循環條件爲while(a[i][j] != n*n) ,方向用四個數字表示,可經過方向變量的值來控制方向變化。

代碼實現

public class NumberOfRounds {
    private static final int DOWN = 0;	//向下
    private static final int LEFT = 1;	//向左
    private static final int UP = 2;   	//向上
    private static final int RIGHT = 3;  //向右
   
    public static void main(String [] args) {		
	Scanner sc = new Scanner(System.in);
	System.out.println("Please input num:");
	int n;
	n = sc.nextInt();
	int[][] roundsNum = new int[n][n];
		
	int number=1;		
	int i=0,j=0;		
	//先單獨處理第一行
	while(i==0&&j<n) {
		roundsNum[i][j] = number++;
		j++;
	}
	j--;
		
	int direction = 0; 
	int step = n-1;
	int currentStep=0;
		
	while(roundsNum[i][j]!=n*n) {
		switch(direction%4){
		case DOWN: 
			i++;								
			break;
		case LEFT:	
			j--;
			break;
		case UP:	
			i--;
			break;
		case RIGHT:	
			j++;
			break;							
		}
			
		roundsNum[i][j] = number++;
		currentStep++;
			
		if(currentStep % step == 0) {
			direction++;
			//走完一個等腰三角形,則將當前已走步數清0,並將步長減1
			if(currentStep == step*2) {	
				step--;
				currentStep=0;
			}
		}
			
	}
		
				
		
    }
}
相關文章
相關標籤/搜索