过河兵
棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C不等于A,同时C不等于B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。
输入
输出
样例输入
4 8 2 4
递推方程:dp[i][j] = dp[i-1][j]+dp[i][j-1];
将马占据的位置和一步能到达的位置设置为0。若某一位置为0,则到此位置的路径数为0,经过此位置到达下一位置的路径数也为0。
注意:马跳跃的边界情况以及路径数的数据精度(我被坑了,在精度这一点)
#include <iostream>
using namespace std;
int n,m,x,y;
long long a[25][25];
int main()
{
cin >> n >> m >> x >> y;
for (int i = 0; i <= n; i++)
for (int j = 0; j <= m; j++)
a[i][j] = 1;
a[x][y] = 0;
a[x+2][y+1] = 0;
a[x+1][y+2] = 0;
if(x >= 1)
a[x-1][y+2] = 0;
if(x >= 2)
a[x-2][y+1] = 0;
if(x >= 2 && y >= 1)
a[x-2][y-1] = 0;
if(x >= 1 && y >= 2)
a[x-1][y-2] = 0;
if(y >= 2)
a[x+1][y-2] = 0;
if(y >= 1)
a[x+2][y-1] = 0;
for(int i = 0; i <= n; i++){
for(int j = 0; j <= m; j++)
{
if (!a[i][j])
continue;
if (i == 0 && j == 0)
continue;
else if (i ==0)
a[i][j] = a[i][j-1];
else if (j==0) a[i][j] = a[i-1][j];
else a[i][j] = a[i-1][j] + a[i][j-1];
}
}
cout << a[n][m];
}