P1958 上学路线 题解
题意简述
一张地图,只能往上往右走,其中有 \(n\) 个障碍不能走上去,问从 \((1,1)\) 走到 \((a,b)\) 有几种方案。
分析
首先,我们将棋盘倒置方便处理,也就是说只能往下往右走。
动态规划。设 \(f_{i,j}\) 表示从 \((1,1)\) 走到 \(f_{i,j}\) 的路径条数,显然
\[f_{i,j}=\begin{cases}1,&i=1\&j=1,\\0,&trap,\\f_{i-1,j}+f_{i,j-1},&otherwise.\end{cases}
\]
代码
#include <bits/stdc++.h>
using namespace std;
int f[45][45], a, b;
int n;
int main() {
cin >> a >> b >> n;
for (int i = 1, x, y; i <= n; i++) {
cin >> x >> y;
f[x][y] = -1;
}
f[1][1] = 1;
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
if (f[i][j] != -1) {
if (f[i - 1][j] != -1)f[i][j] += f[i - 1][j];
if (f[i][j - 1] != -1)f[i][j] += f[i][j - 1];
}
}
}
cout << f[a][b];
return 0;
}