版權聲明:轉載文章爲該文章博主原創文章,遵循 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;
}