中國象棋半張棋盤如圖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;
}
程序運行結果展示:
知識點總結:遞歸和深搜
學習心得:還是比較好理解,就是控制不好做