首先把題目貼上來吧!
小明參加了學校的趣味運動會,其中的一個項目是:跳格子。
地上畫著一些格子,每個格子裡寫一個字,如下所示:(也可參見圖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!希望能夠對大家有幫助!