个人觉得第一种算法比较易懂。
程序1:
public class Test1 {
public static void main(String[] args) {
int rows = 4;
int lines = 4;
int yMin = 1;
int xMin = 1;
int now_n = 1;
int yMax = rows;// 行
int xMax = lines;// 列
int xIndex = xMin;
int yIndex = yMin;
int[][] num = new int[yMax + 1][xMax + 1];
while (xIndex <= xMax && yIndex <= yMax) {
for (xIndex = xMin; xIndex <= xMax; xIndex++) {
num[yIndex][xIndex] = now_n++;
}
xIndex--;
yMin++;
for (yIndex = yMin; yIndex <= yMax; yIndex++) {
num[yIndex][xIndex] = now_n++;
}
yIndex--;
xMax--;
for (xIndex = xMax; xIndex >= xMin; xIndex--) {
num[yIndex][xIndex] = now_n++;
}
xIndex++;
yMax--;
for (yIndex = yMax; yIndex >= yMin; yIndex--) {
num[yIndex][xIndex] = now_n++;
}
yIndex++;
xMin++;
}
for (yIndex = 1; yIndex <= rows; yIndex++) {
for (xIndex = 1; xIndex <= lines; xIndex++) {
System.out.print(num[yIndex][xIndex] + "\t");
}
System.out.println();
}
}
}
程序2:
public class Test2 {
public static void main(String[] args) {
// 矩阵的行列数
int n = 4;
int intA = 1; // 初始化
int[][] array = new int[n][n];
int intB;
if (n % 2 != 0) {
intB = n / 2 + 1; // 奇数时i循环次数
} else {
intB = n / 2; // 偶数时i循环次数
}
for (int i = 0; i < intB; i++) { // 从外到里循环
// 从左到右横的开始
for (int j = i; j < n - i; j++) {
array[i][j] = intA;
intA++;
}
// 从上到下纵
for (int k = i + 1; k < n - i; k++) {
array[k][n - i - 1] = intA;
intA++;
}
// 从右到左横
for (int l = n - i - 2; l >= i; l--) {
array[n - i - 1][l] = intA;
intA++;
}
// 从下到上纵
for (int m = n - i - 2; m > i; m--) {
array[m][i] = intA;
intA++;
}
}
// 输出数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(array[i][j] + "\t");
}
System.out.println();
}
}
}