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