题目
所谓“螺旋方阵”,是指对任意给定的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
我的思路
翻译过来的意思是:
先沿着x轴铺,再沿着y轴铺,铺完一圈后,再铺里面一圈,最中间的那个最后再铺。
至于X轴的转角处要留给Y轴的铺,Y轴的转角处要留给X轴的铺,主要是因为防止重叠。
铺完一圈之后,我们就要把它们的铺地范围缩小,然后再铺地。
分解教学
声明和输入必要变量
int N;
scanf("%d", &N);
int a[10][10] = {0};
int num = 1;
int count = 1;
声明控制范围圈的东西
int x1 = 0;
int x2 = N - 1;
int y1 = 0;
int y2 = N - 1;
- x1主要控制左边的范围;
- x2主要控制右边的范围;
- y1主要控制上面的范围;
- y2主要控制下面的范围。
主程序
while (count < N*N) {
for(int x = x1; x < x2; x++) {
a[y1][x] = num++;
count++;
}
for(int y = y1; y < y2; y++) {
a[y][x2] = num++;
count++;
}
for(int x = x2; x > x1; x--) {
a[y2][x] = num++;
count++;
}
for(int y = y2; y > y1; y--) {
a[y][x1] = num++;
count++;
}
if(x1 != x2 && y1 != y2) {
x1++;
y1++;
y2--;
x2--;
}
}
x < x2
、y < y2
、x > x1
和y > y1
主要用于让X轴的转角处要留给Y轴的铺,Y轴的转角处要留给X轴的铺
设置中心点的值
if(x1 == x2 && y1 == y2) {
a[y1][x1] = num;
}
输出各个点的值
for(int y = 0; y < N; y++) {
for(int x = 0; x < N; x++) {
printf("%3d", a[y][x]);
}
printf("\n");
}
代码全文
#include <stdio.h>
int main() {
// init
int N;
scanf("%d", &N);
int a[10][10] = {0};
int x1 = 0;
int x2 = N - 1;
int y1 = 0;
int y2 = N - 1;
int num = 1;
int count = 1;
// let's go
while (count < N*N) {
for(int x = x1; x < x2; x++) {
a[y1][x] = num++;
count++;
}
for(int y = y1; y < y2; y++) {
a[y][x2] = num++;
count++;
}
for(int x = x2; x > x1; x--) {
a[y2][x] = num++;
count++;
}
for(int y = y2; y > y1; y--) {
a[y][x1] = num++;
count++;
}
if(x1 != x2 && y1 != y2) {
x1++;
y1++;
y2--;
x2--;
}
}
if(x1 == x2 && y1 == y2) {
a[y1][x1] = num;
}
// output
for(int y = 0; y < N; y++) {
for(int x = 0; x < N; x++) {
printf("%3d", a[y][x]);
}
printf("\n");
}
}