java 外螺旋矩阵_螺旋矩阵的java实现
今天參加了騰訊實習生的在線筆試,螺旋矩陣的問題,算是ACM的入門題吧
想到了有兩種實現遞歸和非遞歸
輸入:3
輸出:
1? 2? 3 8? 9? 4 7? 6? 5
輸入:5
輸出:
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
package com.bonult.algorithm;
import java.util.Scanner;
/**
* @author bonult
*
*/
public class HelixMatrix {
public static void main(String[] args) {
int i, j, n;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
sc.close();
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
System.out.print(String.format("%2d ", calculate(n-1, i, j)));
}
System.out.println();
}
}
// 遞歸求解
private static int calculate(int basic, int n, int i, int j) {
if (0 == i) {
return basic + j + 1;
} else if (n - 1 == j) {
return basic + n + i;
} else if (n - 1 == i) {
return basic + 2 * (n - 1) + n - j;
} else if (0 == j) {
return basic + 3 * (n - 1) + n - i;
} else {
return calculate(basic + 4 * (n - 1), n - 2, i - 1, j - 1);
}
}
// 非遞歸求解
private static int calculate(int n, int i, int j) {
// (i, j)位置的數值
int k = 0;
// 用來計算(i, j)的外有幾個完整的“圈”
int mini = i < n - i ? i : n - i;
int minj = j < n - j ? j : n - j;
int min = mini < minj ? mini : minj;
int h;
// h用來控制層數
for (h = 0; h < min; ++h) {
// 內層的圈要比臨近外層的圈的邊長小2
k += (n - 2 * h) * 4;
}
// (i, j)位于同層的上方
if (i == min) {
// 直接取得j坐標的位置,注意需要減掉min,因為外圍已經計算過了
k += j - min + 1;
}
// (i, j)位于同層的右側
else if (j == n - min) {
// 需要加上上方邊長的長度
k += (n - 2 * min) + (i - min) + 1;
}
// (i, j)位于同層的下方
else if (i == n - min) {
// 需要加上上方和右側的長度
k += (n - 2 * min) * 2 + (n - min - j) + 1;
}
// (i, j)位于同層的左側
else if (j == min) {
// 需要加上上方、右側和下方的長度
k += (n - 2 * min) * 3 + (n - min - i) + 1;
}
return k;
}
}
總結
以上是生活随笔為你收集整理的java 外螺旋矩阵_螺旋矩阵的java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并未量产的超重型坦克英国A39土龟
- 下一篇: 中国航空航天博物馆有歼20吗?