/**
* 实验题目:
* 求5x5阶螺旋方阵
* 实验目的:
* 掌握数组算法设计
* 实验内容:
* 以下是一个5x5阶螺旋方阵。编写程序,输出该形式的nxn(n<10)阶方阵(顺时针方向旋进)
* 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
*/
#include <stdio.h>
#define MAX_LEN 10
/*------------------求n阶螺旋方阵a-----------------*/
/**
* 螺旋方阵:
* 是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,
* 按顺时针螺旋方向顺序填入N×N的方阵里。
* 以N=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
* 算法思路:
* 用二维数组a存放n阶螺旋方阵。偶数阶螺旋方阵共有m(m=n/2)圈,
* 奇数阶螺旋方阵共有m(m=n/2+1)圈,对于第i(i从0到m-1共执行m次)圈
* 循环,产生该圈上横行的数字,产生该圈右竖行的数字,产生该圈下
* 横行的数字,产生该圈左竖行的数字。最后输出该方阵。
*
*/
static void helix_matrix(int a[MAX_LEN][MAX_LEN], int n)
{
int m; // 圈数
int i;
int j;
int k = 0;
if(n % 2 == 0) // 偶数阶螺旋方阵
m = n / 2;
else // 奇数阶螺旋方阵
m = n / 2 + 1;
for(i = 0; i < m; i++)
{
// 产生该圈上横行的数字
for(j = i; j < n - i; j++)
{
k++;
a[i][j] = k;
}
// 产生该圈右竖行的数字
for(j = i + 1; j < n - i; j++)
{
k++;
a[j][n - i - 1] = k;
}
// 产生该圈下横行的数字
for(j = n - i - 2; j >= i; j--)
{
k++;
a[n - i - 1][j] = k;
}
// 产生该圈左竖行的数字
for(j = n - i - 2; j >= i + 1; j--)
{
k++;
a[j][i] = k;
}
}
}
int main(void)
{
int n, i, j;
int a[MAX_LEN][MAX_LEN];
printf("输入n(n<10):");
scanf("%d", &n);
helix_matrix(a, n);
printf("%d阶数字方阵如下:\n", n);
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
return 0;
}
测试结果:
输入n(n<10):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