【博弈论】51Nod 1534 棋子游戏
题目内容
波雷卡普和瓦西里喜欢简单的逻辑游戏。今天他们玩了一个游戏,这个游戏在一个很大的棋盘上进行,他们每个人有一个棋子。他们轮流移动自己的棋子,波雷卡普先开始。每一步移动中,波雷卡普可以将他的棋子从\((x,y)\) 移动到\((x-1,y)\) 或者\((x,y-1)\) 。而瓦西里可以将他的棋子从\((x,y)\) 移动到\((x-1,y)\) ,\((x-1,y-1)\) 或者\((x,y-1)\) 。当然他们可以选择不移动。
还有一些其它的限制,他们不能把棋子移动到\(x\)或\(y\)为负的座标,或者移动到已经被对手占据的座标。最先到\((0,0)\)的人获胜。
现在给定他们棋子的座标,判断一下谁会获胜。
输入格式
单组测试数据。第一行包含四个整数\(xp,yp,xv,yv(0≤xp,yp,xv,yv≤10^5)\),表示波雷卡普和瓦西里棋子的座标。输入保证他们的棋子在不同位置,而且没有棋子在\((0,0)\)。
输出格式
如果波雷卡普获胜,输出Polycarp
,否则输出Vasiliy
。
样例输入
2 1 2 25
样例输出
Polycarp
思路
波雷卡普能否取胜就看能不能截住瓦雷西走对角线的路径,或者瓦雷西完全走对角线的最短距离还是大于等于波雷卡普的路径长度。前一种情况只要满足波雷卡普的坐标在第二个人左下角即可。后一种情况,波雷卡普的最少步数是\(x+y\),因为瓦雷西可以斜着走所以最少步数是\(max(x,y)\)。注意当步数相等时是Polycarp
获胜,因为波雷卡普先走。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int xp,yp,xv,yv;
scanf("%d%d%d%d",&xp,&yp,&xv,&yv);
if((xp<=xv&&yp<=yv)||max(xv,yv)>=xp+yp)
puts("Polycarp");
else puts("Vasiliy");
return 0;
}