Gym 101775L-SOS+博弈题 +2017-2018 ACM-ICPC Asia East Continent League Final

版权声明:转载文章为该文章博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

在原文基础上有部分修改,如有修改不对之处,敬请指正!

题目链接

来呀来呀来点我呀

题意

Panda和Sheep在一个1×n的棋盘上下SOS棋,两个人可以下S或者O最先达到“SOS”状态的人赢,给定棋盘长度n,输出赢的人,平局输出Draw。

思路

所有情况中,只有形成了S - - S这种情况时,不管再向里面填了什么,另一个人都会赢,这是这题的突破口

(1)当n小于7的时候,随便模拟一下知道最优情况下都是平局,不会有一个人会让另一个人赢

(2)当n为大于7的奇数时,先手必胜

以7为例:

先手 - - - S - - -

后手 O - - S - - -

先手 O - - S - - S

这样先手就先形成了S - - S这种情况,当n为奇数时,在S - - S外面一定还剩余偶数个待填的位置,那么一定是后手先填进S - - S里,这样先手就必赢

这样我们可以看到,当出现了一个长度为7的空闲格且除了这7个外还剩余偶数个时,先下进7格中间S位置的人就赢了

(3)当n为大于等于16的偶数时,后手必胜

首先先手不可能会赢,因为总数为偶数,S - - S外面会剩余奇数个待填位置

这时会出现两边都有一个长度为7的空闲格,先手不想让后手赢,只能堵住其中一个,但是不能全部堵住

以16为例:

先手 - - - O - - - - - - - - - - - -

后手 - - - O - - - - - - - - S - - -

先手 - - - O - - - - - - - - S - - O

后手 - - - O - - - - - S - - S - - O

这样后手先形成S - - S且待填位置还剩偶数个,一定会后手胜

(4)其他情况下两者谁都赢不了,最优情况下只能平局

(5)当n=14时是比较特殊的,按上面的分析它一边有长度为7的空闲格另一边为长度为6的空闲格(如果下在最中间的位置),但是模拟一下会发现先手有不让后手赢的策略

当n=14

先手 - - - - - - O - - - - - - -

后手 - - - - - - O - - - S - - -

先手- - - - - - O - - - S - - O

这时后手无法在下标8号位置填S,因为会与左侧的O连起来让先手胜,所以只能平局

AC代码

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll maxn=1e6+50;
int main()
{
	ll t;
	ll Case=1;
	scanf("%lld",&t);
	while(t--)
	{
		ll n;
		scanf("%lld",&n);
		if(n>=7)
		{
			if(n&1)printf("Case #%lld: Panda\n",Case++);
			else if(n>=16)printf("Case #%lld: Sheep\n",Case++);
			else printf("Case #%lld: Draw\n",Case++);
		}
		else printf("Case #%lld: Draw\n",Case++);
	}

	return 0;

}
发布了12 篇原创文章 · 获赞 23 · 访问量 1785

猜你喜欢

转载自blog.csdn.net/qq_43816486/article/details/99685457