P1002 过河卒(递堆算法)

题目描述

棋盘上 AA 点有一个过河卒,需要走到目标 BB 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示,AA 点 (0, 0)(0,0)、BB 点 (n, m)(n,m),同样马的位置坐标是需要给出的。

 

P1002 过河卒(递堆算法)_第1张图片

现在要求你计算出卒从 AA 点能够到达 BB 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入格式

一行四个正整数,分别表示 BB 点坐标和马的坐标。

输出格式

一个整数,表示所有的路径条数。

输入输出样例

输入:6 6 3 3

输出:6


#include
#include
#include
#include
using namespace std;
//控制马 
const int change_x[]={0,-2,-1,1,2,1,2,-1,-2};
const int change_y[]={0,1,2,2,1,-2,-1,-2,-1};
//输入 
int end_x,end_y;
int horse_x,horse_y;

long long dp[30][30];//路线数量 
bool map[30][30];//能不能走

int main()
{
	cin>>end_x>>end_y>>horse_x>>horse_y;
	//标记马 	
	for(int i=0;i<9;i++)
	{
		map[horse_x+change_x[i]][horse_y+change_y[i]]=1;
	}
	//递堆 
	for(int i=0;i<=end_x;i++)
	{
		for(int j=0;j<=end_y;j++)
		{
			if(map[i][j])
			{
				continue;
			}
			else
			{
				if(i==0&&j==0)
				{
					dp[i][j]=1;
				}
				else if(i==0&&j>0)
				{
					dp[i][j]=dp[i][j-1];
				}
				else if(i>0&&j==0)
				{
					dp[i][j]=dp[i-1][j];
				}
				else
				{
					dp[i][j]=dp[i-1][j]+dp[i][j-1];
				}
			}
		}
	}
	cout<

 

你可能感兴趣的:(P1002 过河卒(递堆算法))