文章出處

前言

  上一篇《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 }
View Code

  運行結果:

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()