题目背景
在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧……
题目描述
中国象棋半张棋盘如图 1所示。马自左下角 (0,0)(0,0) 向右上角(m,n) 跳。规定只能往右跳,不准往左跳。比如图 1 中所示为一种跳行路线,并将路径总数打印出来。

输入格式
只有一行:两个数 n,m。
输出格式
只有一个数:总方案数total。
输入输出样例
输入 #1
4 8
输出 #1
37
说明/提示
对于 100%100% 的数据:n,m≤18
分析
虽然是搜索回溯,但也可以用递推来做
step1:确认递推式
dp[i][j]+=dp[i-x[k]][j-y[k]];
step2:递推式执行条件
if(i-x[k]>=0&&j-y[k]>=0)
dp[i][j]+=dp[i-x[k]][j-y[k]];
step3:开始写代码
......
AC代码
#include<bits/stdc++.h>//万能头文件
using namespace std;//使用标准命名空间
int dp[21][21],x[4]={1,2,2,1},y[4]={2,1,-1,-2};//dp为原数组,x、y分别为横、纵轴方向数组
int main()
{
int n,m;
cin>>n>>m;//数据输入
dp[0][0]=1;//相当于递归中的dp(1),从1开始递推
for(int i=1;i<=m;i++)//类似暴力求解,三重嵌套循环
{
for(int j=0;j<=n;j++)
for(int k=0;k<=3;k++)
if(i-x[k]>=0&&j-y[k]>=0)
dp[i][j]+=dp[i-x[k]][j-y[k]];//递推式
}
cout<<dp[m][n];//数据输出
return 0;
}
2773

被折叠的 条评论
为什么被折叠?



