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;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章