一、题目
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
二、思路
其实说实在的,用8个不同数字代表“从我做起振兴中华”然后手写强算也是可以的hhhhh,就是普通的组合问题。
但是从左上角开始计算,只有两个移动方向,所以这里选择使用dfs来计算。
可以设定(1,1)为起点,(4,5)作为终点,或者可以用步数(8)作为终点。
三、题解
#include <iostream> using namespace std; int right_direction[2]={1,0};//向右移动 int down_direction[2]={0,1};//向下移动 int visited[4][5]={0};//默认没有访问过 int ans=0;//记录路线数量 void dfs(int row,int column) { if(row>4 || column>5 ) //越界情况 { return ; } if(row==4 && column==5) { ans++; return; } for (int i=0;i<2;i++)//移动 { int right_forward = row + right_direction[i]; int down_forward = column + down_direction[i]; if(right_forward >= 1 && right_forward <= 4 && down_forward >= 1 && down_forward <= 5 ) { if(!visited[right_forward-1][down_forward-1]) { visited[right_forward-1][down_forward-1]=1; } dfs(right_forward,down_forward); visited[right_forward-1][down_forward-1]=0; } } } int main() { visited[0][0]=1; dfs(1,1); cout << ans << endl; return 0; }
四、结果
35
Process finished with exit code 0