A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的 C 点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 CC 点上的马可以控制 9 个点(图中的 P1,P2⋯P8和 C)。卒不能通过对方马的控制点。
棋盘用坐标表示,A 点(00)、B 点(n,m)、C 点(cx,cy)(0
输入格式
输入 4 个整数,n,m,cx,cy,分别表示 B 点的横纵坐标和 C 点的横纵坐标。
输出格式
输出一个整数,代表从 A 点走到 B 点的所有路径数。
样例输入
5 5 2 4
样例输出
14
我的思路:
首先根据马的坐标位置求出马将要跳的点。
在dp中清除这些点的路段。
进行一个dpi中(i,j)为坐标,dpi为所有路径数的状态转移即可。
详情见代码:
#include<iostream>
#define ll long long
using namespace std;
int main(){
int n,m,Cx,Cy;
ll dp[21][21]={0};
cin>>n>>m>>Cx>>Cy;
dp[Cx][Cy]=-1;
for(int i=-2;i<=2;i++){
for(int j=-2;j<=2;j++){
if(i!=j&&i*j&&-1*i!=j)
dp[Cx+i][Cy+j]=-1;
}
}
dp[0][0]=1;
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
if(dp[i][j]<0){
dp[i][j]=0;
continue;
}
if(i!=0) dp[i][j]+=dp[i-1][j];
if(j!=0) dp[i][j]+=dp[i][j-1];
}
}
cout<<dp[n][m];
}