题目描述
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的。
现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入输出格式
输入格式:一行四个数据,分别表示B点坐标和马的坐标。
输出格式:一个数据,表示所有的路径条数。
输入输出样例
输入样例#1:
6 6 3 3
输出样例#1:
6
说明
结果可能很大!
起始点从(0,0)开始,为了方便,使起始点变成(1,1),终点也加一就行。
动规,每一点是由左边或者上边来的,加起来。
转移方程就是 f[i][j] = f[i-1][j] + f[i][j-1]
1 #include<cstdio> 2 #include<algorithm> 3 4 using namespace std; 5 const int N = 25 ; 6 typedef long long ll; 7 int ex,ey,mx,my; 8 ll f[N][N]; 9 bool mp[N][N]; 10 11 void init() 12 { 13 mp[mx][my] = true ; 14 mp[mx-1][my-2] = true ; 15 mp[mx-1][my+2] = true ; 16 mp[mx-2][my-1] = true ; 17 mp[mx-2][my+1] = true ; 18 mp[mx+1][my+2] = true ; 19 mp[mx+1][my-2] = true ; 20 mp[mx+2][my+1] = true ; 21 mp[mx+2][my-1] = true ; 22 } 23 int main() 24 { 25 scanf("%d%d%d%d",&ex,&ey,&mx,&my); 26 init(); 27 f[1][0] = 1; 28 for(int i=1;i<=ex+1;++i) 29 { 30 for(int j=1;j<=ey+1;++j) 31 { 32 f[i][j] = f[i-1][j]+f[i][j-1]; 33 if(mp[i-1][j-1]) f[i][j] = 0; 34 } 35 } 36 printf("%lld",f[ex+1][ey+1]); 37 return 0; 38 }