#include <bits/stdc++.h>
using namespace std;
int main()
{
long long x, y, m, n, w[21][21] = {0};
cin >> x >> y >> m >> n;
for (int i = 0; i <= 20; ++ i)
for (int j = 0; j <= 20; ++ j)
w[i][j]= 1;
w[m][n] = 0;
if (m >= 2 && n >= 1) w[m-2][n-1] = 0;
if (m >= 1 && n >= 2) w[m-1][n-2] = 0;
if (m >= 2 ) w[m-2][n+1] = 0;
if (m >= 1 ) w[m-1][n+2] = 0;
if (n >= 1 ) w[m+2][n-1] = 0;
if (n >= 2 ) w[m+1][n-2] = 0;
w[m+2][n+1] = 0;
w[m+1][n+2] = 0;
for (int i = 0; i <= x; ++ i)
{
for (int j = 0; j <= y; ++ j)
{
if (w[i][j] != 0)
{
if(i == 0 && j == 0)
;
else if (i == 0 && j > 0)
w[i][j] = w[i][j-1];
else if (j == 0 && i > 0)
w[i][j] = w[i-1][j];
else
w[i][j] = w[i-1][j] + w[i][j-1];
}
}
}
cout << w[x][y];
return 0;
}
马以及马能到的位置都不能走因此给他设置为0,注意边界情况
w[m][n] = 0;
if (m >= 2 && n >= 1) w[m-2][n-1] = 0;
if (m >= 1 && n >= 2) w[m-1][n-2] = 0;
if (m >= 2 ) w[m-2][n+1] = 0;
if (m >= 1 ) w[m-1][n+2] = 0;
if (n >= 1 ) w[m+2][n-1] = 0;
if (n >= 2 ) w[m+1][n-2] = 0;
w[m+2][n+1] = 0;
w[m+1][n+2] = 0;
当w[i][j] 不为0时,说明这个点可以到达。
此时,到达这个点的道路的数量=到达这个点左边点道路数+到达这个点上面点道路数
w[i][j] = w[i-1][j] + w[i][j-1]
要注意边界,即在边界,左边或上面没有其他点了
else if (i == 0 && j > 0)
w[i][j] = w[i][j-1];
else if (j == 0 && i > 0)
w[i][j] = w[i-1][j];
这道题,一开始有两个点过不了。后来将道路数数组输出后,发现出现负数,此时意识到是数据溢出。因此将 int 类型改为long long ,之后提交通过!