版权声明:转载文章为该文章博主原创文章,遵循 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;
}