洛谷P1002过河卒

洛谷P1002过河卒

原理:

  1. 定义二维数组,每个坐标数据为零点到该坐标的路径数目。
  2. 易知data[x,y]=data[x-1][y]+data[x][y-1];

过程:

  1. 定义一个25*25的二维数组存储数据,可memset初始化数组为全0;
  2. 将(0,0)定义为1;
  3. 将马所在坐标与马控制的八个坐标定义为-1;
  4. 遍历数组,当所在坐标为-1时则置为0;else,则为该坐标左边与上边数据之和。
#include<iostream>
using namespace std;
#define LEN 25
int main()
{
	long long ar[LEN][LEN];
	int tx, ty, hx, hy;
	cin >> tx >> ty >> hx >> hy;
	tx++;
	ty++;
	hx++;
	hy++;
	ar[1][1] = 1;
	ar[hx][hy] = -1;
	
	//上
	if (hx - 2 >= 1)
	{
		if (hy - 1 >= 1)
			ar[hx - 2][hy - 1] = -1;
		if (hy + 1 <= ty)
			ar[hx - 2][hy + 1] = -1;
	}
	//下
	if (hx + 2 <= tx)
	{
		if (hy - 1 >= 1)
			ar[hx + 2][hy - 1] = -1;
		if (hy + 1 <= ty)
			ar[hx + 2][hy + 1] = -1;
	}
	//左
	if (hy - 2 >= 1)
	{
		if (hx - 1 >= 1)
			ar[hx - 1][hy - 2] = -1;
		if (hx + 1 <= tx)
			ar[hx + 1][hy - 2] = -1;
	}
	//右
	if (hy + 2 <= ty)
	{
		if (hx - 1 >= 1)
			ar[hx - 1][hy + 2] = -1;
		if (hx + 1 <= tx)
			ar[hx + 1][hy + 2] = -1;
	}

	for (int i = 1; i <= tx; i++)
		for (int j = 1; j <= ty; j++)
		{
			if (i == 1 && j == 1)
				continue;
			if (ar[i][j] == -1)		
			{
				ar[i][j] = 0;		
				continue;
			}
			ar[i][j] = ar[i - 1][j] + ar[i][j - 1];
		}
	cout << ar[tx][ty];
	//system("pause");
	return 0;
}

附:概率论路径问题的解决办法
原理:假设一个坐标(0,0)->(6,7)的棋盘,易知从原点无障碍最短路线到达终点,必经过6个x方向单位以及7个y方向单位共13个单位长度。故分配xy单位的方式数目即为路线数目。例如:xxyyxxyyxxyyy、xyxyxxxxyyyyy、……
所以C(13,6)=C(13,7)=路径数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值