C算法编程题(二)正螺旋

前言

  上一篇《C算法编程题(一)扑克牌发牌

  写东西前总是喜欢吐槽一些东西,还是多啰嗦几句吧,早上看了一篇博文《谈谈外企涨工资那些事》,里面楼主讲到外企公司包含的五类人,其实不只是外企如此,私企和合资的都是如此,一些公司反正什么人都有,就怕你的上司是第一种,你的同事是第二种。这种搭配最讨人厌,反正技术和工作效率不怎么样,“做人”还蛮会做的。其实不管公司怎样,同事怎样,工作环境怎样。就像里面楼主说的,都要坚持自己选择的路,并坚持走下去。。。

  这几天都在博园逛一些技术大牛的博客,也买了本相关的数,在博园主要看些设计模式之类的,看了很是心血澎湃,真的希望自己有一天也可以写一些之类的文章。昨天下了一位园友写的一个权限管理系统,里面用到了mvc、ef、easyui和一些设计模式,自己接下来要好好研究下。其实一直有个想法是,希望可以把.net底层搞透,并整理一套属于自己的框架,慢慢优化下去,就像胡哥一样。完成这些,虽死无憾,哈哈哈。。。

  说的有点多了,会到正题,我一开始写这类算法编程题的时候,一是想可以帮到开始学习算法编程的同学们,二是锻炼自己的脑细胞,希望死的不要太多。还有就是写这些编程题和C++其实没什么关系,只是用简单的语法实现功能而已,重要的是逻辑思路,大家也可以看成是奥数题。

  网上看到一套趣味编程题,希望接下来可以一一和大家分享。

程序要求

  程序描述:

  从键盘输入一个整数(1~20)
    则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如:
    输入数字2,则程序输出:
    1 2
    4 3
    输入数字3,则程序输出:
    1 2 3
    8 9 4
    7 6 5
    输入数字4, 则程序输出:
     1   2   3  4
    12  13  14  5
    11  16  15  6
    10   9   8  7

程序实现

  这个编程题大家可能都做过,算是比较经典的算法编程题了,当然也有很多的实现方法,这里我讲一种。

  我们先分析下,这个题目主要是输出数字螺旋,我们可以看成是四个方向:

  1,左-->右

  2,上-->下

  3,右-->左

  4,下-->上

  而且这四个方向的数字是依次递增的,那我们可以这样思考,整个输出是一个二维数组,行和列数是一样的,比如输入4,那1-12就是第一圈,12-16就是第二圈,每一圈又分四个方向。

  我们可以先这样定义:

1     int num[80][80];
2     int i,j;
3     int rows,quan;

  num数组表示的是输出的数组,rows就是行列数,也就是我们输入的值,quan表示的是螺旋的圈数,i表示的是螺旋上的数字,j等下我们程序中讲,我们代码可以这样写:

 1     scanf("%d",&rows);
 2     quan=0;
 3     for(i=1;i<=rows*rows;quan++)
 4     {
 5         if(i==rows*rows)
 6             num[(rows-1)/2][(rows-1)/2]=i++;
 7         else
 8         {
 9             for(j=quan;j<rows-1-quan;j++)
10                 num[quan][j]=i++;
11             for(j=quan;j<rows-1-quan;j++)
12                 num[j][rows-quan-1]=i++;
13             for(j=rows-1-quan;j>quan;j--)
14                 num[rows-quan-1][j]=i++;
15             for(j=rows-1-quan;j>quan;j--)
16                 num[j][quan]=i++;
17         }
18     }

  最外层的for是循环圈数的意思,里面if是判断最后一圈是不是单独的数字,就像行数如果是3,那最后一圈就只要一个数字9,下面四个for就是代表的上面说的四个方向。大家看下代码就懂得,这里我就不多说了。

  大家可能有更好的实现方式,希望可以多多交流,

  完整程序代码:

 1 #include "stdio.h"
 2 #include "string.h"
 3 #include "stdlib.h"
 4 
 5 void main()
 6 {
 7     int num[80][80];
 8     int i,j;
 9     int rows,quan;
10 
11     scanf("%d",&rows);
12     quan=0;
13     for(i=1;i<=rows*rows;quan++)
14     {
15         if(i==rows*rows)
16             num[(rows-1)/2][(rows-1)/2]=i++;
17         else
18         {
19             for(j=quan;j<rows-1-quan;j++)
20                 num[quan][j]=i++;
21             for(j=quan;j<rows-1-quan;j++)
22                 num[j][rows-quan-1]=i++;
23             for(j=rows-1-quan;j>quan;j--)
24                 num[rows-quan-1][j]=i++;
25             for(j=rows-1-quan;j>quan;j--)
26                 num[j][quan]=i++;
27         }
28     }
29 
30     for(i=0;i<rows;i++)
31     {
32         for(j=0;j<rows;j++)
33         {
34             printf("%4d",num[i][j]);
35         }
36         printf("
");
37     }
38 }
View Code

  运行结果:

原文地址:https://www.cnblogs.com/xishuai/p/3398799.html