题目
Description
小徐酷爱打篮球,在小学期的前两周半都在练习篮球。
今天,小徐想要练习如何突破。练习场地可由如下所示的网格图表示,图中的位置可用坐标表示。
其中A点(0,0)为小徐的起始位置,B点(n,m)为小徐想要到达的位置。
一起训练的还有场上的防守队员小彩,其位于C点。已知小徐行动时只能向右或向下前进,且当小徐相对于小彩的位置为Pi(i = 1,2…8)时,小徐会被抢断。
注意,Pi坐标是会随C位置的变化而变化的,但相对位置是固定的
现在要求你计算小徐从A点到达B点且不被抢断的路径条数。假设小彩的位置是固定不动的,并不是小徐走一步小彩走一步。
Input
一行四个正整数,分别表示B点坐标和C点坐标。
Output
一个整数,表示所有的路径条数。
Hint
对于全部的数据,1≤n,m≤20,0≤ C点的横纵坐标 ≤20。
C++完整代码
#include <iostream>
using namespace std;int main() {long long Bx, By, Cx, Cy;cin >> Bx >> By >> Cx >> Cy;long long dp[21][21] = { 0 };if ((Cx == 0 && Cy == 0) || (abs(0 - Cx) == 2 && abs(0 - Cy) == 1) || (abs(0 - Cx) == 1 && abs(0 - Cy) == 2))dp[0][0] = 0;elsedp[0][0] = 1;for (int i = 1; i <= By; i++) {if (0 == Cx && i == Cy) {dp[0][i] = 0;}else if ((abs(0 - Cx) == 2 && abs(i - Cy) == 1) || (abs(0 - Cx) == 1 && abs(i - Cy) == 2)) {dp[0][i] = 0;}else {dp[0][i] = dp[0][i - 1];}}for (int i = 1; i <= Bx; i++) {if (i == Cx && 0 == Cy) {dp[i][0] = 0;}else if ((abs(i - Cx) == 2 && abs(0 - Cy) == 1) || (abs(i - Cx) == 1 && abs(0 - Cy) == 2)) {dp[i][0] = 0;}else {dp[i][0] = dp[i - 1][0];}}for (int i = 1; i <= Bx; i++) {for (int j = 1; j <= By; j++) {if (i == Cx && j == Cy) {continue;}else if ((abs(i - Cx) == 2 && abs(j - Cy) == 1) || (abs(i - Cx) == 1 && abs(j - Cy) == 2)) {continue;}else {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}cout << dp[Bx][By] << endl;return 0;
}