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

来源:互联网 发布:windows 远程桌面 打开 编辑:程序博客网 时间:2024/05/01 04:52

给定一个整数 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 ;

}



1 0
原创粉丝点击