程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 第四屆藍橋杯C/C++A組題目:振興中華,藍橋振興中華

第四屆藍橋杯C/C++A組題目:振興中華,藍橋振興中華

編輯:關於C語言

第四屆藍橋杯C/C++A組題目:振興中華,藍橋振興中華


  首先把題目貼上來吧!

  小明參加了學校的趣味運動會,其中的一個項目是:跳格子。

  地上畫著一些格子,每個格子裡寫一個字,如下所示:(也可參見圖1)

    從我做起振
    我做起振興
    做起振興中
    起振興中華

  圖1

  比賽時,先站在左上角的寫著“從”字的格子裡,可以橫向或縱向跳到相鄰的格子裡,但不能跳到對角的格子或其它位置。一直要跳到“華”字結束。

  要求跳過的路線剛好構成“從我做起振興中華”這句話。

  請你幫助小明算一算他一共有多少種可能的跳躍路線呢?

  這個題目蠻簡單,所以為了提升難度,後來我又添加了兩個要求:

  1.能夠把所有行走的路徑輸出出來!

  2.能夠按照要求輸出特定一條路徑。(比如這條路徑: 從→我↓做↓起↓振→興→中→華)

 

  OK,簡單說一下我的思路:

    首先把“從我做起,振興中華”這八個字按照0~7的順序編好,然後把這個方格存放在一個4*5的二維數組array裡面,同時,設定一個同樣大小的flag數組來存放行走軌跡,最後還要設定一個road_flag[7]的數組來記錄行走的步子是橫向還是縱向。

    

    接下來就是利用遞歸遍歷這個二維數組,

    遞歸過程是:從0,0開始,橫著或者豎著前進,向前前進一格的條件就是沒有超出范圍,並且下一格的數字比這一格大1。每次前進一格後,就把flag數組中相應的位置標記為1,同時根據行走的步子的方向來對road_flag中的相應步數進行標記。

    如果到達了華這個字(相應的數字為7),那麼就到了遞歸出口,判斷這一條路徑是否符合要求,是否能夠輸出,然後返回。

    函數返回之後,要把相應的路徑標記和步子標記清除。

 

    就這樣一直遍歷,直到把所有的路徑都找出來!

 

  程序的代碼如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define ROW 4
 4 #define COL 5
 5 
 6 int count;        //統計路徑的次數
 7 int flag[ROW][COL]; //路徑標記
 8 int road_flag[ROW+COL-1];   //步子標記
 9 int road_count;        //用來記錄走的步數
10 
11 int road(int arr[][COL],int row,int col);
12 
13 int main(int argc,char *argv[])
14 {
15     int array[ROW][COL] = {
16     {0,1,2,3,4},
17     {1,2,3,4,5},
18     {2,3,4,5,6},
19     {3,4,5,6,7}   };
20 
21     road(array,0,0);
22     printf("count = %d\n",count);
23 
24     return 0;
25 }
26 int road(int arr[][COL],int row,int col)
27 {
28     flag[row][col]=1;    //標記路徑
29 
30     if(arr[row][col] == 7)
31     {
32     count++;
33     //printf("No.%d:\n",count);
34 
35     //判斷這一條路徑是否符合我們的要求
36     if(1==road_flag[0] && 2==road_flag[1] && 2==road_flag[2] &&
37        2==road_flag[3] && 1==road_flag[4] && 1==road_flag[5] &&
38        1==road_flag[6]
39     )
40         for(int rloop=0;rloop<ROW;rloop++)
41         {
42         for(int cloop=0;cloop<COL;cloop++)
43         if(1 == flag[rloop][cloop])
44             printf(" # ");
45         else
46             printf(" ^ ");
47         printf("\n");
48         }
49     return 0;
50     }
51     //橫向走
52     if(col+1<COL && arr[row][col+1]==arr[row][col]+1)
53     {
54     road_flag[road_count] = 1;  //標記步子
55     road_count++;
56 
57     road(arr,row,col+1);    
58 
59     //取消路徑和步子標記
60     flag[row][col+1] = 0;
61     road_count--;
62     road_flag[road_count] = 0;
63     }
64     //縱向走
65     if(row+1<ROW && arr[row+1][col]==arr[row][col]+1)
66     {
67     road_flag[road_count] = 2;  //標記步子
68     road_count++;
69 
70     road(arr,row+1,col);
71 
72     //取消路徑和步子標記
73     flag[row+1][col] = 0;
74     road_count--;
75     road_flag[road_count] = 0;
76     }
77 }

  Ok,上面這個程序就能夠按照我們的要求輸出特定的路徑(從→我↓做↓起↓振→興→中→華),而那個count就是一共有多少條路徑!如果想要輸出全部的路徑,只需要把遞歸出口中的那個if語句(36~39)去掉,並且把它上面的那個printf語句的注釋(33)取消掉,就能查看所有的路徑了!

  程序的運行結果如下:

  

  輸出全部路徑的結果則如下圖:

  

 

  Ok,That‘s all!希望能夠對大家有幫助!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved