螺旋矩阵(C语言实现)- 2016.01.04
2016-01-05 00:51
471 查看
给定一个整数 N , 生成一个 N * N 的矩阵,矩阵中的元素取值为 1 ~ N*N , 1 在左上角,其余各数按顺时针方向旋转前进,依次递增。例如,当 N = 4 时,矩阵的内容如下:
则,可以按横(从左到右,即 1 - 4)竖(从上到下,即5 - 6 )横(从右到左 7 - 10 )竖(从下到上 11 - 12),这是一轮计算,其次的计算按这种规则进行递归,具体的代码如下所示:
1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 |
#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 ; } |
相关文章推荐
- C++模板类声明与定义
- C语言数据库
- 笔试,面试,C/C++,判断单链表是否带环?若带环,求环长度,求环入口点(两种方法)
- 一个c++的开发人员,大学毕业时必须掌握哪些课程和技能?
- 自动注册工厂消灭switch-case
- 彻底搞定C语言指针详解-完整版-时候初学者-必备
- C#调用c++dll时,关于回调函数
- 一起talk C栗子吧(第九十回:C语言实例--使用管道进行进程间通信三)
- C++继承方式
- c++回调函数 callback
- C++中字符串的分割
- 理解C语言——从小菜到大神的晋级之路(5)——程序流程控制
- 【VC++6.0】成功制作并使用lib库,转载
- 深入C语言内存区域分配(进程的各个段)详解(转)
- 九九乘法表(C语言实现)- 2016.01.04
- C++开发人脸性别识别教程(5)——通过FaceRecognizer类实现性别识别
- C++ 单链表的基本算法
- C++基础知识总结
- C++模版-重载,嵌套
- C/C++之回调函数