蓝桥杯——2013年C++A组第3题:振兴中华【dfs】

一、题目

    小明参加了学校的趣味运动会,其中的一个项目是:跳格子。

    地上画着一些格子,每个格子里写一个字,如下所示:(也可参见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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章