您的位置:首页 > 编程语言 > C语言/C++

螺旋矩阵(C语言实现)- 2016.01.04

2016-01-05 00:51 471 查看
给定一个整数 N , 生成一个 N * N 的矩阵,矩阵中的元素取值为 1 ~ N*N , 1 在左上角,其余各数按顺时针方向旋转前进,依次递增。例如,当 N = 4 时,矩阵的内容如下:

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

则,可以按横(从左到右,即 1 - 4)竖(从上到下,即5 - 6 )横(从右到左 7 - 10 )竖(从下到上 11 - 12),这是一轮计算,其次的计算按这种规则进行递归,具体的代码如下所示:

#include "stdio.h"

#include "stdlib.h" // DEV 中为了使用 system 调用而引入的头文件

#define Max 10000 // 定义 N*N的最大值

int main(int argc,char *argv[])

{

int a[Max] ;

int N=0 , NC , num = 0, n = 1;

printf("请输入参数N:");

scanf("%d",&N); // 即输入的参数

NC = N ; // 由于每计算一次都会使得行数或者列数减 2 ,所以用 N的副本 NC 控制程序的计算次数

while( NC > 0)

{

for(int i = 1 ,j = num + 1; i <= N - num *2 ; i ++,n ++, j ++)

a [ num*N + j] = n ; // 计算第一行,每一次循环第一行的行号会加 1 ,打印的数目会减 2

for(int i = num + 2 ; i <= N - (num+1) ; i ++,n++)

a [ i*N - num] = n ; // 计算右面一列,每一次循环右面一列的起始和终止行号都会减 1

for(int i = N-num , j = 1; j <= N - num*2 ; j ++, n ++)

a [ i * N - j - num + 1] = n ; // 计算最下面一列,每一次循环,最后一行的行号会减 1 ,打印的数目会减 2

for(int i = N-num-2; i>num; i--,n++)

a [i * N+num+1] = n ; // 计算最左面一列,每一次循环左面的一列的起始地址和

if(NC>=2)

NC -= 2;

else // 当输入的参数为奇数时,省去最后一次计算

NC=0;

num ++ ;

}

if( N%2 != 0) //当 N 为奇数时,将省去的最后一次计算填充

a[ (((N-1)/2)*N) + (N+1)/2] = N*N ;

for(int i = 1 ; i <= N*N ; i ++)

{

printf("%d ",a[i]);

if(!(i%N))

printf("\n");

}

system("pause"); // 由于在 dev 中最后的终端会直接退出,为了使终端可以停下来让我们观察

return 0 ;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: