洛谷 P1002过河卒 题解

本题通过标数法解决,卒到达棋盘某点的路径数等于到达其上点和左点的路径数之和。卒不能吃掉马,若马的控制点在X轴或Y轴上,对应轴上所有点的路径数设为0,以避免卒无法返回。代码实现中考虑了这些特殊情况。
摘要由CSDN通过智能技术生成

其实,本题稍加分析就能发现,要到达棋盘上的一个点,只能从左边(我们称之为左点)或者上边(我们称之为上点)过来,所以根据加法原理,到达某一点的路径数目,就等于到达其相邻的上点和左点的路径数目之和。这就是小学数学中经常使用的标数法,对于马的控制点也完全适用,只要将到达该点的路径数目设置为0即可。

但是这题有很多坑:

1.卒不能把马吃掉,否则这题肯定不止橙题;

2.如果马有控制点在X轴或Y轴上,那么整个X轴或Y轴都要标为0.为什么呢?我们可以举个例子。

如上图,蓝色的是卒(将卒的位置标为(0,0)),红色的则是马的控制点,且不说(1,1)这个位置有一个控制点,就算把这个点去掉,卒还是到不了(0,3)或者(0,5),因为卒必须得绕开(0,2)和(0,4)上的控制点,这就意味着它离开了X轴,那么它就不可能再回去了(因为只能往右或往下走)

所以完整代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long a[21][21];
	int x1,y1,x2,y2;
	cin>>x1>>y1>>x2>&g
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一个典型的动态规划问题。首先,我们将整个棋盘看作一个二维数组,数组的每个元素表示到达该位置的路径数目。然后,我们根据题目给出的条件,逐步更新数组中的元素,直到计算出到达目标位置的路径数目。 具体的解题思路如下: 1. 首先,我们可以将马的位置设置为0,表示无法经过该位置。 2. 然后,我们根据马的位置,更新数组中的元素。对于二维数组中的每个位置,我们根据左边和上边的位置来计算到达当前位置的路径数目。具体地,如果左边和上边的位置都可以经过,那么到达当前位置的路径数目就等于左边和上边位置的路径数目之和。如果左边或上边的位置无法经过,那么到达当前位置的路径数目就等于左边或上边位置的路径数目。 3. 最后,我们输出目标位置的路径数目。 下面是洛谷p1002过题解的C++代码: ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long a[21][21]; int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; // 初始化数组,马的位置设置为0 for(int i=0; i<=20; i++) { for(int k=0; k<=20; k++) { a[i][k] = 1; } } a[x2][y2] = 0; // 根据马的位置更新数组中的元素 if(x2 >= 2 && y2 >= 1) a[x2-2][y2-1] = 0; if(x2 >= 1 && y2 >= 2) a[x2-1][y2-2] = 0; if(x2 <= 18 && y2 >= 1) a[x2+2][y2-1] = 0; if(x2 <= 19 && y2 >= 2) a[x2+1][y2-2] = 0; if(x2 >= 2) a[x2-2][y2+1] = 0; if(x2 >= 1) a[x2-1][y2+2] = 0; if(y2 >= 1) a[x2+2][y2-1] = 0; if(y2 >= 2) a[x2+1][y2-2] = 0; // 动态规划计算路径数目 for(int i=1; i<=20; i++) { for(int k=1; k<=20; k++) { if(a[i][k] != 0) { a[i][k] = a[i-1][k] + a[i][k-1]; } } } // 输出目标位置的路径数目 cout << a[x1][y1] << endl; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值