标签:
首先把题目贴上来吧!
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见图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!希望能够对大家有帮助!
标签:
原文地址:http://www.cnblogs.com/bwangel23/p/4278629.html