码迷,mamicode.com
首页 > 其他好文 > 详细

[51Nod1534] 棋子游戏

时间:2020-05-29 20:54:07      阅读:41      评论:0      收藏:0      [点我收藏+]

标签:情况   mamicode   com   sum   lang   img   博弈   lan   必须   

题目

原题地址

解说

简单博弈论。
简单情况下,即假设不发生一个棋子阻挡另一个棋子的去路,那么情况非常简单,两人都必须走完\(x+y\)的路程,先手一次可以走一步,所以时间也为\(x+y\),后手可以先一直让\(x,y\)都减一,一个消耗完后再让另一个参量一步减一。这一部分的代码:

int sum1=x1+y1,sum2=min(x2,y2);
x2-=sum2;y2-=sum2;
sum2+=x2+y2;
if(sum1<=sum2) printf("Polycarp");
else printf("Vasiliy");

那么有遮挡时情况麻烦一些。我们要判断何时有遮挡以及遮挡会对二者产生什么影响这两件事。
首先,若两人都没有斜着走这种操作,不可能发生遮挡,因为最短路线有好几条,哪怕对手故意要挡自己亦可以绕开。技术图片

那么现在后手可以斜着走了,那么我们就可以发现若先手两坐标均小于后手的,就可以在后手斜着走时将他拦下,因为先手到后手斜径的路程一定小于等于后手走到那里要用的步数。
技术图片

这样的话我们就需要在前边那部分代码之前加一个这种情况的判断。

if(x1<=x2&&y1<=y2) {
	printf("Polycarp");
	return 0;
}

总代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int x1,y1,x2,y2;
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
	if(x1<=x2&&y1<=y2) {
		printf("Polycarp");
		return 0;
	}
	int sum1=x1+y1,sum2=min(x2,y2);
	x2-=sum2;y2-=sum2;
	sum2+=x2+y2;
	if(sum1<=sum2) printf("Polycarp");
	else printf("Vasiliy");
	return 0;
}

幸甚至哉,歌以咏志。

[51Nod1534] 棋子游戏

标签:情况   mamicode   com   sum   lang   img   博弈   lan   必须   

原文地址:https://www.cnblogs.com/DarthVictor/p/12989320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!