第四届蓝桥杯C/C++A组题目:振兴中华
2015-02-07 12:14
302 查看
首先把题目贴上来吧!
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见图1)
从我做起振
我做起振兴
做起振兴中
起振兴中华
图1
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
这个题目蛮简单,所以为了提升难度,后来我又添加了两个要求:
1.能够把所有行走的路径输出出来!
2.能够按照要求输出特定一条路径。(比如这条路径: 从→我↓做↓起↓振→兴→中→华)
OK,简单说一下我的思路:
首先把“从我做起,振兴中华”这八个字按照0~7的顺序编好,然后把这个方格存放在一个4*5的二维数组array里面,同时,设定一个同样大小的flag数组来存放行走轨迹,最后还要设定一个road_flag[7]的数组来记录行走的步子是横向还是纵向。
接下来就是利用递归遍历这个二维数组,
递归过程是:从0,0开始,横着或者竖着前进,向前前进一格的条件就是没有超出范围,并且下一格的数字比这一格大1。每次前进一格后,就把flag数组中相应的位置标记为1,同时根据行走的步子的方向来对road_flag中的相应步数进行标记。
如果到达了华这个字(相应的数字为7),那么就到了递归出口,判断这一条路径是否符合要求,是否能够输出,然后返回。
函数返回之后,要把相应的路径标记和步子标记清除。
就这样一直遍历,直到把所有的路径都找出来!
程序的代码如下:
Ok,上面这个程序就能够按照我们的要求输出特定的路径(从→我↓做↓起↓振→兴→中→华),而那个count就是一共有多少条路径!如果想要输出全部的路径,只需要把递归出口中的那个if语句(36~39)去掉,并且把它上面的那个printf语句的注释(33)取消掉,就能查看所有的路径了!
程序的运行结果如下:
输出全部路径的结果则如下图:
Ok,That‘s all!希望能够对大家有帮助!
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见图1)
从我做起振
我做起振兴
做起振兴中
起振兴中华
图1
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
这个题目蛮简单,所以为了提升难度,后来我又添加了两个要求:
1.能够把所有行走的路径输出出来!
2.能够按照要求输出特定一条路径。(比如这条路径: 从→我↓做↓起↓振→兴→中→华)
OK,简单说一下我的思路:
首先把“从我做起,振兴中华”这八个字按照0~7的顺序编好,然后把这个方格存放在一个4*5的二维数组array里面,同时,设定一个同样大小的flag数组来存放行走轨迹,最后还要设定一个road_flag[7]的数组来记录行走的步子是横向还是纵向。
接下来就是利用递归遍历这个二维数组,
递归过程是:从0,0开始,横着或者竖着前进,向前前进一格的条件就是没有超出范围,并且下一格的数字比这一格大1。每次前进一格后,就把flag数组中相应的位置标记为1,同时根据行走的步子的方向来对road_flag中的相应步数进行标记。
如果到达了华这个字(相应的数字为7),那么就到了递归出口,判断这一条路径是否符合要求,是否能够输出,然后返回。
函数返回之后,要把相应的路径标记和步子标记清除。
就这样一直遍历,直到把所有的路径都找出来!
程序的代码如下:
#include<stdio.h> #include<string.h> #define ROW 4 #define COL 5 int count; //统计路径的次数 int flag[ROW][COL]; //路径标记 int road_flag[ROW+COL-1]; //步子标记 int road_count; //用来记录走的步数 int road(int arr[][COL],int row,int col); int main(int argc,char *argv[]) { int array[ROW][COL] = { {0,1,2,3,4}, {1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7} }; road(array,0,0); printf("count = %d\n",count); return 0; } int road(int arr[][COL],int row,int col) { flag[row][col]=1; //标记路径 if(arr[row][col] == 7) { count++; //printf("No.%d:\n",count); //判断这一条路径是否符合我们的要求 if(1==road_flag[0] && 2==road_flag[1] && 2==road_flag[2] && 2==road_flag[3] && 1==road_flag[4] && 1==road_flag[5] && 1==road_flag[6] ) for(int rloop=0;rloop<ROW;rloop++) { for(int cloop=0;cloop<COL;cloop++) if(1 == flag[rloop][cloop]) printf(" # "); else printf(" ^ "); printf("\n"); } return 0; } //横向走 if(col+1<COL && arr[row][col+1]==arr[row][col]+1) { road_flag[road_count] = 1; //标记步子 road_count++; road(arr,row,col+1); //取消路径和步子标记 flag[row][col+1] = 0; road_count--; road_flag[road_count] = 0; } //纵向走 if(row+1<ROW && arr[row+1][col]==arr[row][col]+1) { road_flag[road_count] = 2; //标记步子 road_count++; road(arr,row+1,col); //取消路径和步子标记 flag[row+1][col] = 0; road_count--; road_flag[road_count] = 0; } }
Ok,上面这个程序就能够按照我们的要求输出特定的路径(从→我↓做↓起↓振→兴→中→华),而那个count就是一共有多少条路径!如果想要输出全部的路径,只需要把递归出口中的那个if语句(36~39)去掉,并且把它上面的那个printf语句的注释(33)取消掉,就能查看所有的路径了!
程序的运行结果如下:
输出全部路径的结果则如下图:
Ok,That‘s all!希望能够对大家有帮助!
相关文章推荐
- 2013年第四届蓝桥杯试题(C/C++本科A组) 振兴中华
- 第四届蓝桥杯A组--从我做起振兴中华
- 2013年第四届蓝桥杯全国软件大赛本科A组c++预赛 题目及参考答案
- 第四届蓝桥杯 省赛 JavaB组 振兴中华
- 第四届蓝桥杯JAVA B组省赛真题-振兴中华
- 第四届蓝桥杯C++A组 振兴中华
- 第四届 蓝桥杯C/C++ 高职 1、题目标题: 猜年龄
- 第四届蓝桥杯初赛 C/C++ A组 3. 振兴中华 二叉树的深度遍历
- 第四届蓝桥杯 振兴中华
- 蓝桥杯:振兴中华
- 第四届蓝桥杯C++本科B组预赛解题报告
- 运行时间排列第四届蓝桥杯C++本科B组解题报告
- 2013第四届蓝桥杯 C/C++本科A组 真题答案解析
- 第四届蓝桥杯初赛 C/C++ A组 4. 颠倒的价牌
- 第四届 蓝桥杯C/C++ B组 第1题高斯日记
- 第四届蓝桥杯C/C++本科B组第二道大题
- 第四届蓝桥杯C++本科B组决赛解题报告
- 第四届 蓝桥杯C/C++ 高职 7、核桃的数量
- 2013第四届蓝桥杯 C/C++本科A组 真题答案解析
- 第四届 蓝桥杯C/C++ 高职 5公约数公倍数