过河卒
时间限制:1秒 内存限制:128M
题目描述
如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。
棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。
输入描述
键盘输入
B点的坐标(n,m)以及对方马的坐标(X,Y){不用判错}
输出描述
一个整数(路径的条数)。
样例
输入
6 6 3 2
输出
17
提示
【数据范围】
对于 100% 的数据,1≤n,m≤20,0≤ 马的坐标 ≤20。
#include<cmath>
#include<cstdio>
#include<string>
#include<iomanip>
#include<iostream>
#include<algorithm>
using namespace std;
long long map[50][50];
bool st[50][50];
void biaoji(int mx,int my){
st[mx][my]=1;
st[mx+2][my+1]=1;
st[mx+1][my+2]=1;
st[mx-1][my+2]=1;
st[mx-2][my+1]=1;
st[mx-2][my-1]=1;
st[mx-1][my-2]=1;
st[mx+1][my-2]=1;
st[mx+2][my-1]=1;
}
int main(){
int bx,by,mx,my;
cin>>bx>>by>>mx>>my;
bx+=2;
by+=2;
mx+=2;
my+=2;
map[2][2]=1;
biaoji(mx,my);
for(int i=2;i<=bx;i++){
for(int j=2;j<=by;j++){
if(st[i][j]!=1&&map[i][j]==0){
map[i][j]=map[i-1][j]+map[i][j-1];
}
}
}
cout<<map[bx][by];
return 0;
}