前言
上一篇《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 }
運行結果:
文章列表