- [NOIP2002普及组] 过河卒
- 题目描述
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1中的C点和P1,……,P8,卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在要求你计算出卒从A点能够到达B点的路径的条数。
具体图片网址(https://imgcdn.mimadao.com/oj/1608795943433.gif)
输入格式
给出n、m和C点的坐标。
输出格式
从A点能够到达B点的路径的条数。
样例
输入样例
8 6 0 4
输出样例
1617
过程思路:
大家看到这题一般会用搜索来做,也许调试时全过,但运行时当n、m=15时就会超时
其实,本题稍加分析就能发现,要到达棋盘上的一个点,只能从左边或上面过来(以下称为左点和上点)
递推关系式如下:
a[i][j]=a[i-1][j]+a[i][j-1]
代码:
#include
#include
using namespace std;
int fx[9]={0,-2,-1,1,2,2,1,-1,-2},fy[9]={0,1,2,2,1,-1,-2,-2,-1};
int ax,ay,mx,my;
long long ans;
long long f[30][30];
bool v[30][30];
int main()
{
cin>>ax>>ay>>mx>>my;
ax++;ay++;mx++;my++;
f[1][1]=1;
v[mx][my]=1;
for(int i=1;i<=8;i++)
v[mx+fx[i]][my+fy[i]]=1;
for(int i=1;i<=ax;i++)
for(int j=1;j<=ay;j++)
{
if(v[i][j])continue;
f[i][j]=max(f[i][j],f[i-1][j]+f[i][j-1]);
}
cout<<f[ax][ay];
cin>>ax;
return 0;
}
[NOIP2002普及组] 过河卒
最新推荐文章于 2024-08-16 08:17:29 发布