栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

洛谷 P1002过河卒 题解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

洛谷 P1002过河卒 题解

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

但是这题有很多坑:

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

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

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

所以完整代码如下:

#include
using namespace std;
int main()
{
	long long a[21][21];
	int x1,y1,x2,y2;
	cin>>x1>>y1>>x2>>y2;
	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>=2 && y2>=1) a[x2-1][y2-2]=0;
	a[x2+2][y2+1]=0;
	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;
	if(x2==2) 
	for(int k=y2+1;k<=20;k++) a[0][k]=0;
	if(x2==1) 
	for(int k=y2+2;k<=20;k++) a[0][k]=0;
	if(x2==0) 
	for(int k=y2;k<=20;k++) a[0][k]=0;
	if(y2==2) 
	for(int i=x2+1;i<=20;i++) a[i][0]=0;
	if(y2==1) 
	for(int i=x2+2;i<=20;i++) a[i][0]=0;
	if(y2==0) 
	for(int i=x2;i<=20;i++) a[i][0]=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<

因为作者非常糟糕,所以若有不足请在评论区中指出。

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号