【騰訊機試題】根據輸入的一個整數,輸出蛇形矩陣
阿新 • • 發佈:2019-02-18
蛇形矩陣示例:
整數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