跳马问题
题目背景
在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧……
题目描述
中国象棋半张棋盘如图 1 1 1 所示。马自左下角 ( 0 , 0 ) (0,0) (0,0) 向右上角 ( m , n ) (m,n) (m,n) 跳。规定只能往右跳,不准往左跳。比如图 1 1 1 中所示为一种跳行路线,并将路径总数打印出来。
输入格式
只有一行:两个数 n n n, m m m。
输出格式
只有一个数:总方案数 t o t a l total total。
样例 #1
样例输入 #1
4 8
样例输出 #1
37
提示
对于 100 % 100\% 100% 的数据: n , m ≤ 18 n, m\leq 18 n,m≤18
#include<bits/stdc++.h>
using namespace std;
int dx[5]={0,-2,-1,1,2};
int dy[5]={0,1,2,2,1};//用两个数组来遍历马走的方向
int n,m,ans;
void dfs(int x,int y)
{
if(x==n&&y==m)//到达终点
{
ans++;//总路径数加1
return;//回溯
}
for(int i=1;i<=4;i++)
if(x>=0&&x<=n&&y>=0&&y<=m)//边界
dfs(x+dx[i], y+dy[i]);//加深搜索
}
int main()
{
cin>>n>>m;
dfs(0,0);//从(0,0)开始走
cout<<ans;//输出答案
return 0;
}
1.分别用dx dy两个数组来遍历不同方向上x,y的变化量
2.因为数据量比较小,所以可以用深搜做,每次跳都尝试四个方向