题目描述Description
设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马。
规定:
1)马只能走日字
2)马只能向右跳
问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数。
![]()
输入描述Input Description
第一行2个整数n和m
第二行4个整数x1,y1,x2,y2
输出描述Output Description
输出方案数
样例输入Sample Input
30 30
1 15 3 15
样例输出Sample Output
2
数据范围及提示Data Size & Hint
2<=n,m<=50
解题思路:
棋盘型递归。
直接上动态方程,画个图就出来了
d[i][j]=d[i-2][j+1]+d[i-2][j-1]+d[i-1][j+2]+d[i-1][j-2];
i 代表 x轴,j代表y轴。
只要你设一个全局数组,就不用考虑什么边界问题,出边界都直接为0.
初始化,设马的初始位置是hx,hy
则d【hx】【hy】 = 1
设终点坐标为ex,ey
然后注意循环是
for i from hx+1 to ex do
for j from 1 to n do
然后你就把程序写出来了。
你把程序提交上去了,
你发现你过了两组数据,还有两组你过不了
你在那里改你的代码,好久好久,但是呢,你找不出原因,
这时候我告诉你
要用 long long unsigned 才能过,你一定气得怒砸键盘。
废话不多说,上代码
#include <iostream>
using namespace std;
long long unsigned d[60][60];
int main(){
int n,m;
cin>>n>>m;
int hx,hy;
cin>>hx>>hy;
int ex,ey;
cin>>ex>>ey;
d[hx][hy]=1;
for(int i=hx+1;i<=ex;i++){
for(int j=1;j<=m;j++){
d[i][j]=d[i-2][j+1]+d[i-2][j-1]+d[i-1][j+2]+d[i-1][j-2];
}
}
cout<<d[ex][ey];
}