藍橋杯訓練:廣搜——跳馬

問題描述:
中國象棋半張棋盤如圖1所示。馬自左下角(0,0)向右上角(m,n)跳。規定只能往右跳,不準往左跳。比如圖1中所示爲一種跳行路線,並將路徑總數打印出來。
作者:何知令
完成時間:2017年6月4日
輸入格式:
只有一行:兩個數n,m


輸出格式:

只有一個數:總方案數total。

解題思路:仔細想想馬跳的情況就四種:右一上二,右一下二,右二上一,右二下一,而馬的每一個位置都只有這四種跳法,求每一位置馬的跳格最終就可跳刀目標位置

,所以用遞歸方法求解。

代碼:

/*
問題描述:
中國象棋半張棋盤如圖1所示。馬自左下角(0,0)向右上角(m,n)跳。規定只能往右跳,不準往左跳。比如圖1中所示爲一種跳行路線,並將路徑總數打印出來。
作者:何知令
完成時間:2017年6月4日
輸入格式:
只有一行:兩個數n,m

輸出格式:
只有一個數:總方案數total。
解題思路:仔細想想馬跳的情況就四種:右一上二,右一下二,右二上一,右二下一,而馬的每一個位置都只有這四種跳法,求每一位置馬的跳格最終就可跳刀目標位置
,所以用遞歸方法求解。
*/
#include <stdio.h>
#include <stdlib.h>
int m,n;
int totle=0;
void jump(int r,int c,int a,int b)//r,c表示馬現在的位置,a,b分別表示馬往右和往上跳幾格
{
    if(r<0||r>m||c<0||c>n)
        return;
    if(r+a==m&&c+b==n)//判斷是否是解
    {
        totle++;
        return;
    }
    /*馬符合題目要求的四種跳法,在馬的當前位置分別選擇枚舉這四種跳法會將所有情況枚舉完*/
    jump(r+a,c+b,2,1);
    jump(r+a,c+b,-2,1);
    jump(r+a,c+b,1,2);
    jump(r+a,c+b,-1,2);
}
int main()
{
    scanf("%d %d",&m,&n);
    jump(0,0,0,0);
    printf("%d",totle);
    return 0;
}

程序運行結果展示:


知識點總結:遞歸和深搜

學習心得:還是比較好理解,就是控制不好做


發佈了302 篇原創文章 · 獲贊 43 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章