Chinaunix首页 | 论坛 | 博客
  • 博客访问: 172555
  • 博文数量: 39
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 214
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-21 11:10
文章分类

全部博文(39)

文章存档

2017年(6)

2016年(1)

2015年(6)

2014年(26)

我的朋友

分类: C/C++

2017-07-25 20:01:16

输入N,用C语言生成N*N的螺旋数组,并打印出来。
例如:
9   10  11  12  
8   1   2   13  
7   0   3   14  
6   5   4   15

分析:
N=1 的时候     0

N=2 的时候     
1   2
0   3

N=3 的时候
8   1   2   
7   0   3   
6   5   4

开辟一个二维数组N*N,然后按照螺旋特性填充数组,最后再遍历打印。找到螺旋的中心位置,如果是偶数则,数组下标为i=N/2; j=N/2-1;    然后,每层分两次打印,横着走和竖着走。代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. void print_array(int **a, int n){
  5.     int i,j;

  6.     if(n>1){
  7.         for(i=0; i<n; i++){
  8.             for(j=0; j<n; j++){
  9.                 printf("%-3d ", a[i][j]);
  10.             }
  11.             printf("\n");
  12.         }
  13.     }else{
  14.         printf("0");
  15.     }
  16.     printf("\n");

  17. }

  18. void print_screw(int n){
  19.     int i = 0;
  20.     int sqrtn = n*n;
  21.     int **arr;
  22.     int starti, startj;
  23.     int level;
  24.     int count;
  25.     int dir=0;/*0:up, 1:right, 2:down, 3:left*/

  26.     if(n == 0 || n<1 )
  27.         return ;

  28.     arr = malloc(sizeof(int *)*n);
  29.     if(!arr)
  30.         return;
  31.     for(i=0; i<n; i++){
  32.         arr[i] = malloc(sizeof(int)*n);
  33.         if(!arr[i])
  34.             return ;
  35.     }

  36.     if(n%2 == 0){
  37.         starti = n/2;
  38.         startj = n/2-1;
  39.         if(startj < 0)
  40.             startj = 0;
  41.     }else{
  42.         starti=startj=(n-1)/2;
  43.     }

  44.     printf("i=%d j=%d\n", starti, startj);

  45.     arr[starti][startj] = 0;
  46.     count++;
  47.     level=1;
  48.     dir = 0;

  49.     while(count == level*level && count<sqrtn){
  50.         /*层级往前移动,先附上第一个值*/
  51.         level++;
  52.         switch(dir){
  53.             case 0:
  54.                 starti--;
  55.             break;
  56.             case 1:
  57.                 ++startj;
  58.             break;
  59.             case 2:
  60.                 ++starti;
  61.             break;
  62.             case 3:
  63.                 --startj;
  64.             break;
  65.         }
  66.         arr[starti][startj]=count;
  67.         count++;
  68.         dir=(dir+1)%4;

  69.         /*走两边,一边 level-1个数, 走到level-1个数的时候,需要转换方向*/
  70.         for(i=0;i<2*(level-1);i++){
  71.             if(i==(level-1))
  72.                 dir=(dir+1)%4;
  73.             switch(dir){
  74.                 case 0:
  75.                     starti--;
  76.                 break;
  77.                 case 1:
  78.                     ++startj;
  79.                 break;
  80.                 case 2:
  81.                     ++starti;
  82.                 break;
  83.                 case 3:
  84.                     --startj;
  85.                 break;
  86.             }
  87.             arr[starti][startj] = count;
  88.             count++;
  89.         }
  90.     }

  91.     print_array(arr, n);

  92.     for(i=0; i<n; i++){
  93.         free(arr[i]);
  94.     }
  95.     free(arr);

  96. }

  97. int main(int argc, char *argv[]){
  98.     int n = 0;


  99.     if(argc < 2)
  100.         return 0;

  101.     n = atoi(argv[1]);
  102.     printf("argc=%d n=%d\n", argc, n);

  103.     print_screw(n);

  104. }









阅读(1945) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~