以下是一个5*5阶螺旋方阵, 请写出程序, 输出N*N阶的方阵(顺时针方向递进)
如下图所示
看图, 分析, 我们可以发现一个规律, 螺旋递进可以分为4个步骤
- 由左到右
- 由上到下
- 由右到左
- 由下到上
将其分为4个小步骤之后我们又可以发现, 每当执行完这4个步骤后, 螺旋方阵的阶次就减少了2, (例如, 当前图 5阶方阵执行完4个步骤, 变成了3阶方阵)
每一步赋值时, 首尾的地方会重复, 则第一步赋值由首位开始, 第二步赋值则向下偏移一位, 避免重复, 下面两步也是如此, 需要偏移一位赋值
每一步方法的实现(重点)
首先, 我们对方阵建立一个二维坐标系, 如下图
我们使用一个二维数组来承载这个方阵 int matrix[][] = new int[N][N];, 这样就变得非常简单了
以从左到右这步为例子, 我们只需要 确定3个数字既可以完成赋值, 分别为左上点, 左右点, 以及Y值,
对代码进行分析
左上点为 int lt = (M - N) / 2; 即为, 原方阵的阶次 减去 当前方阵的阶次 再除以 2 , 以为方阵缩小是向着中心缩小, 左右都一起缩小
则除以二, 既可以得到左上 点, 以后 个点都是由此方法得到的
static void left_to_right(int num[][], int M, int N) {
int lt = (M - N) / 2; // 左上点,
int rt = (M - N) / 2 + N -1;
int y = (M - N) / 2;
for(int i=lt; i<=rt; i++) {
num[y][i] = count;
count ++;
}
}
java代码实现
public class Main{
static int count = 1;
public static void main(String[] args) {
int N = 0;
Scanner input = new Scanner(System.in);
N = input.nextInt();
input.close();
int matrix[][] = new int[N][N];
matrix[0][0] = 1;
int M = N;
while(true) {
left_to_right(matrix, N, M);
top_to_bottom(matrix, N, M);
right_to_left(matrix, N, M);
bottom_to_top(matrix, N, M);
M -= 2;
if(M < 1) {
break;
}
}
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
String num = String.format("%4d ", matrix[i][j]);
System.out.print(num);
}
System.out.println("");
}
}
// 4个步骤 参数分别为, 存储的数组, 原方阵阶数, 当前方阵阶数
static void left_to_right(int num[][], int M, int N) {
int lt = (M - N) / 2;
int rt = (M - N) / 2 + N -1;
int y = (M - N) / 2;
for(int i=lt; i<=rt; i++) {
num[y][i] = count;
count ++;
}
}
static void top_to_bottom(int num[][], int M, int N) {
int rt = (M - N) / 2 + 1;
int rb = (M - N) / 2 + N -1;
int x = (M - N) / 2 + N - 1;
for(int i=rt; i<=rb; i++) {
num[i][x] = count;
count ++;
}
}
static void right_to_left(int num[][], int M, int N) {
int rb = (M - N) / 2 + N -1 -1;
int lb = (M - N) / 2;
int y = (M - N)/2 + N - 1;
for(int i=rb; i>=lb; i--) {
num[y][i] = count;
count ++;
}
}
static void bottom_to_top(int num[][], int M, int N) {
int lb = (M - N) / 2 + N -1 -1;
int lt = (M - N) / 2;
int x = (M - N) / 2;
for(int i=lb; i>lt; i--) {
num[i][x] = count;
count ++;
}
}
}