• 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

      运行结果:

  • 相关阅读:
    BZOJ 3505: [Cqoi2014]数三角形 数学
    BZOJ 3931: [CQOI2015]网络吞吐量 最大流
    BZOJ 4236: JOIOJI MAP
    BZOJ 4247 挂饰 背包DP
    hihocoder #1224 : 赛车 dfs
    hihocoder #1223 : 不等式 水题
    BZOJ 3224: Tyvj 1728 普通平衡树 treap
    uoj #31. 【UR #2】猪猪侠再战括号序列 贪心
    BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数
    心跳回忆4 攻略
  • 原文地址:https://www.cnblogs.com/xishuai/p/3398799.html
Copyright © 2020-2023  润新知