题目背景
在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧……
题目描述
中国象棋半张棋盘如图 11 所示。马自左下角 (0,0)(0,0) 向右上角 (m,n)(m,n) 跳。规定只能往右跳,不准往左跳。比如图 11 中所示为一种跳行路线,并将路径总数打印出来。
输入格式
只有一行:两个数 nn,mm。
输出格式
只有一个数:总方案数 totaltotal。
输入输出样例
输入 #1复制
4 8输出 #1复制
37说明/提示
对于 100\%100% 的数据:n, m\leq 18n,m≤18
题目类型:dfs , dp, 模拟
解题思路:(dfs)马要到达(n,m)点就要向上向右行动, 在本题中 若某点(i,j)在通过
扫描二维码关注公众号,回复:
13294845 查看本文章

(i+1, j+2),(i+2, j+1),(i-1, j+2),(i-2,j+1)等操作后能到达(n,m)点则,可能路径数加一
(dp)用 dp[x][y] 记录到当前点(x,y)的可能路径数,递推公式为:
dp[x][y] = dp[x-1][y-2]+dp[x-2][y-1]+dp[x+1][y-2]+dp[x+2][y-1];
AC代码:
#include <bits/stdc++.h>
#define rep(x, a, b) for(int x = a; x<=b; x++)
#define pre(x, a, b) for(int x=a; x>=b; x--)
using namespace std;
const int N = 2e6+20;
int dx[5] = {0, -2, -1, 1, 2};
int dy[5] = {0, 1, 2, 2, 1};//本题中horse 只能向上的四个方向走。
int board[20][20];
int cot;
int n, m;
void dfs(int x, int y)
{
if(x == n && y == m)
{
cot++; return;
}
else
rep(i, 1, 4)
if(x>=0 && x<= n && y>=0 && y<=m)
dfs(x+dx[i], y+dy[i]);
}
int main()
{
scanf("%d%d", &n, &m);
dfs(0, 0);
cout<<cot;
return 0;
}