前言
上一篇《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("\n"); 37 } 38 }
运行结果: