过河卒
题目描述
棋盘上AAA点有一个过河卒,需要走到目标BBB点。卒行走的规则:可以向下、或者向右。同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,AAA点(0,0)(0, 0)(0,0)、BBB点(n,m)(n, m)(n,m)(nnn, mmm为不超过202020的整数),同样马的位置坐标是需要给出的。
现在要求你计算出卒从AAA点能够到达BBB点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入格式
一行四个数据,分别表示BBB点坐标和马的坐标。
输出格式
一个数据,表示所有的路径条数。
输入输出样例
输入 #1
6 6 3 3
输出 #1
6
说明/提示
结果可能很大!
【解题思路】
经典老题,看代码
1 #include <iostream>
2 using namespace std;
3 long long x1,y1,x2,y2,p[22][22];
4 int pan(long long x1,long long y1, long long x2, long long y2)
5 {
6 p[x2][y2]=-1;
7 if (x2+2<=x1&&y2+1<=y1) p[x2+2][y2+1]=-1;
8 if (x2+2<=x1&&y2-1>=1) p[x2+2][y2-1]=-1;
9 if (x2+1<=x1&&y2+2<=y1) p[x2+1][y2+2]=-1;
10 if (x2+1<=x1&&y2-2>=1) p[x2+1][y2-2]=-1;
11 if (x2-1>=1&&y2+2<=y1) p[x2-1][y2+2]=-1;
12 if (x2-1>=1&&y2-2>=1) p[x2-1][y2-2]=-1;
13 if (x2-2>=1&&y2+1<=y1) p[x2-2][y2+1]=-1;
14 if (x2-2>=1&&y2-1>=1) p[x2-2][y2-1]=-1;
15 return 0;
16 }
17 int main()
18 {
19 cin >>x1>>y1>>x2>>y2;
20 x2++; y2++; x1++; y1++;
21 p[1][0]=1;
22 pan(x1,y1,x2,y2);
23
24 for (long long o1=1;o1<=x1;o1++)
25 for (long long o2=1;o2<=y1;o2++)
26 {if (p[o1][o2]==-1)p[o1][o2]++; else p[o1][o2]=p[o1-1][o2]+p[o1][o2-1];}
27 cout <<p[x1][y1];
28 return 0;
29 }