所谓 “螺旋方阵”,是指对任意给定的 N,将 1 到 N×N 的数字从左上角第 1 个格子开始,按顺时针螺旋方向顺序填入 N×N 的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数 N(<10)。
输出格式:
输出 N×N 的螺旋方阵。每行 N 个数字,每个数字占 3 位。
输入样例:
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
来源:
来源:PTA | 程序设计类实验辅助教学平台
链接:https://pintia.cn/problem-sets/13/exam/problems/520
提交:
题解:
#include<stdio.h>
int main(void) {
int N;
scanf("%d", &N);
// 上、下、左、右边界的值
int upBorder = 0;
int leftBorder = 0;
int rightBorder = N - 1;
int downBorder = N - 1;
// 行、列下标
int row = 0;
int col = 0;
int number = 1;
int matrix[10][10] = {0};
// 填充螺旋方阵
while (number <= N * N) {
// 上边框元素,从左往右,行标不变,列标递增到 rightBorder
for (; col <= rightBorder; col++) {
matrix[row][col] = number;
number++;
}
col--;
// 右边框元素,从上往下,列标不变,行标递增到 downBorder
for (row++; row <= downBorder; row++) {
matrix[row][col] = number;
number++;
}
row--;
// 下边框元素,从右往左,行标不变,列标递减到 leftBorder
for (col--; col >= leftBorder; col--) {
matrix[row][col] = number;
number++;
}
col++;
// 左边框元素,从下往上,列标不变,行标递减到 upBorder
for (row--; row > upBorder; row--) {
matrix[row][col] = number;
number++;
}
// 移动到下一层的第一个元素
row++;
col++;
// 右、下边界减 1;左、上边界增 1
rightBorder--;
downBorder--;
leftBorder++;
upBorder++;
}
// 输出螺旋方阵
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%3d", matrix[i][j]);
}
printf("\n");
}
return 0;
}