zoukankan      html  css  js  c++  java
  • [51Nod1534] 棋子游戏

    题目

    原题地址

    解说

    简单博弈论。
    简单情况下,即假设不发生一个棋子阻挡另一个棋子的去路,那么情况非常简单,两人都必须走完(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;
    }
    

    幸甚至哉,歌以咏志。

  • 相关阅读:
    try catch 和\或 finally 的用法
    postgresql与oracle对比
    今天遇到个let: not found
    NTLM相关
    【搜藏】net use命令拓展
    【shell进阶】字符串操作
    【网摘】网上邻居用户密码
    测试导航
    关系代数合并数据 left join
    真正的程序员
  • 原文地址:https://www.cnblogs.com/DarthVictor/p/12989320.html
Copyright © 2011-2022 走看看