1. 程式人生 > >【騰訊機試題】根據輸入的一個整數,輸出蛇形矩陣

【騰訊機試題】根據輸入的一個整數,輸出蛇形矩陣

蛇形矩陣示例:

整數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

生成蛇形矩陣A的關鍵是,建立與其對應的導航矩陣B。所謂導航矩陣,就是B[i][j]所儲存的內容指示了A[i][j]的下一個元素在其左側、右側、上側還是下側。這裡,我使用-1,1,-2,2分別代表左,右,上,下。那麼整數4對應的蛇形矩陣的導航矩陣為:

1(右) 1(右) 1(右) 2(下)
1(右) 1(右) 2(下) 2(下)
-2(上) -2(上) -1(左) 2(下)
-2(上) -1(左) -1(左) -1(左)

很容易看出其中的規律,導航矩陣每一圈的四個角中的元素都分別為1,2,-1,-2;而在1和2之間用1填充,2和-1之間用2填充,-1和-2之間用-1填充,-2和1之間用-2填充。需要注意的一點是,處在對角線上的1的下側元素為1(終點除外,終點指最大元素所處的單元,比如4的蛇形矩陣的終點是儲存16的單元)。建立了導航矩陣,那麼就可以從A[0][0]開始,A[0][0]初始為1,遵循導航矩陣,尋找下一個單元,下一單元的值為當前單元的值加1,直至終點出現,則結束尋找。如有更好的演算法,歡迎留言與樓主討論^_^

具體程式碼如下:

import java.util.*;
public class SnackMatrix {
	public static void main(String args[]){
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int[][] B = new int[n][n];
		int[][] A = new int[n][n];
		
		//初始化
		for(int i=0; i<n; i++){
			for(int j=0; j<n; j++){
				A[i][j] = 0;
				B[i][j] = 0;
			}
		}
		
		//完善導航矩陣B
		for(int i=0; i<n/2; i++){
			B[i][i] = 1; //1表示當前元素的下一個元素在右邊
			B[i+1][i] = 1;
			B[i][n-i-1] = 2; //2表示當前元素的下一個元素在下邊
			B[n-i-1][n-i-1] = -1; //-1表示當前元素的下一個元素在左邊
			B[n-i-1][i] = -2; //-2表示當前元素的下一個元素在上邊
		}
		for(int i=0; i<n/2; i++){
			int j = 1;
			while(B[i][i+j]!=2){
				B[i][i+j] = 1;
				j++;
			}
			j = 1;
			while(B[i+j][n-i-1]!=-1){
				B[i+j][n-i-1] = 2;
				j++;
			}
			j = 1;
			while(B[n-i-1][n-i-1-j]!=-2){
				B[n-i-1][n-i-1-j] = -1;
				j++;
			}
			j = 1;
			while(B[n-i-1-j][i]!=1){
				B[n-i-1-j][i] = -2;
				j++;
			}
		}
		//根據導航矩陣B來完善蛇形矩陣A
		A[0][0] = 1;
		int i=0, j=0;
		while(A[i][j]!=n*n){
			switch(B[i][j]){
			case 1:
				A[i][j+1] = A[i][j]+1;
				j++;
				break;
			case 2:
				A[i+1][j] = A[i][j]+1;
				i++;
				break;
			case -1:
				A[i][j-1] = A[i][j]+1;
				j--;
				break;
			case -2:
				A[i-1][j] = A[i][j]+1;
				i--;
				break;
			}
		}
		for(i=0; i<n; i++){
			for(j=0; j<n; j++){
				System.out.print(A[i][j]+" ");
			}
			System.out.println();
		}
	}
}

示例:

輸入:

8

輸出:

1 2 3 4 5 6 7 8 
28 29 30 31 32 33 34 9 
27 48 49 50 51 52 35 10 
26 47 60 61 62 53 36 11 
25 46 59 64 63 54 37 12 
24 45 58 57 56 55 38 13 
23 44 43 42 41 40 39 14 
22 21 20 19 18 17 16 15