P1002 过河卒(洛谷)
这道题dp题~
马所控制的点不允许走,问路径有多少条。
我先开始试试用dfs写的,tle了。
最后还是dp解决的。
这道题需要注意的是范围问题。
因为马控制了包括它自己位置所在内的9个点。注意这九个点是否都在地图的范围之内,需要判断一下。然后这些点不能走。
之后两重循环遍历就行。
因为题目规定只能往下走或者往右走,所以一个点只允许从上或者从左走过来,这两个方向上的和就是当前点的路径数。
初始话坐标(0,0)的路径dp[0][0] = 1;就行
注意开long long,因为可能有超级多条
代码部分:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 25;
const int dir[2][2] = {{1, 0}, {0, 1}};
ll mp[N][N];
ll dp[N][N];
int a, b;
int n, m;
int main()
{
cin >> a >> b >> n >> m;
mp[n][m] = -1;
if (n + 2 <= a && m + 1 <= b)
{
mp[n + 2][m + 1] = -1;
}
if (n + 1 <= a && m + 2 <= b)
{
mp[n + 1][m + 2] = -1;
}
if (n - 1 >= 0)
{
mp[n - 1][m + 2] = -1;
}
if (n - 2 >= 0)
{
mp[n - 2][m + 1] = -1;
}
if (n - 2 >= 0 && m - 1 >= 0)
{
mp[n - 2][m - 1] = -1;
}
if (n - 1 >= 0 && m - 2 >= 0)
{
mp[n - 1][m - 2] = -1;
}
if (m - 2 >= 0)
{
mp[n + 1][m - 2] = -1;
}
if (m - 1 >= 0)
{
mp[n + 2][m - 1] = -1;
}
for (int i = 0; i <= a; i++)
{
for (int j = 0; j <= b; j++)
{
if (!i && !j)
{
dp[i][j] = 1;
continue;
}
if (mp[i][j] == -1)
{
continue;
}
if (i - 1 >= 0)
{
dp[i][j] += dp[i - 1][j];
}
if (j - 1 >= 0)
{
dp[i][j] += dp[i][j - 1];
}
}
}
cout << dp[a][b] << endl;
return 0;
}