Gym - 101775L SOS 博弈 找规律

题目:https://cn.vjudge.net/problem/Gym-101775L

PS:训练赛中被这道题折磨的不轻,和队友反复推必胜态与必败态试图推导出公式或者规律,然后推的心态逐渐失控,,,最后十分钟没辙了,队友站在一起,猜,猜一个规律出来,emmm,比赛半路中不经意听到旁边打过这场EC-final现场赛的学长说这题打表找规律,还在对面A题后讨论中听到16和偶数,嘿嘿,于是迫不得已猜规律,比赛还剩三十秒时交上去第三个规律,就,,,就A了,,,和另一位队友逗比的叫了起来,emmm,感觉rp消耗干净

思路:好的,回归正题,这道题虽说是一道打表找规律的题,但其实是可以当博弈思维题来看的,首先我们不难看出,S _ _ S是一个必胜态,谁在营造一个S _ _ S并逼对手先进这个区域谁就可以获胜,现在我们来考虑这个必胜态,我们不难发现在n==7时第一次有人(Panda)可以营造一个第一个对自己有利的必胜态,在panda先手在4位置放置一个S,不管sheep如何放置,panda都可以在另一方放置一个S达到S _ _ S来使自己获胜,我们不难看出,当营造完S _ _ S后,决定谁先进入这个禁区的是剩余空格的数量,当n==7时剩余数量m为偶数,也就是说一定是sheep先进入这个区域,panda获胜,继续推导我们发现,n==9时panda获胜,n==11,13,15时均可获胜,于是我们有一个大胆的猜想,大于7的奇数获胜,大于7的偶数平局,好的,恭喜你,你将收获一个红色wrong answer,其实我们并没有什么根据说明先手一定不会败,接下来考虑偶数的时候后手能否获胜,我们不难看出,如果先手下一个S之后,后手总可以下一个S产生必胜态并保证剩余的格子数可以使对面先进入这些禁区,于是偶数时先手需要尽量保持平局,于是先手使用打乱后手使后手营造不出必胜态,但后手能否在先手尽力干扰的情况下营造一个必胜态呢,不要忘了,先手营造的时候后手也是在干扰的,于是,我们想到那个神奇的数字——7,有七个格子可以供后手放置的时候后手就可以营造出对自已有利的局面,但考虑对面先放O,所以我们时不能在O方便放置S的,所以这个数字应该是8,当先手怎么阻止,都会给后手留至少相连的八个格子,这个局面我们不难画出:_ _ _ _ _ _ _ O _ _ _ _ _ _ _ _,而这个数字是——16

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int T, t = 0, n;
 9     scanf("%d", &T);
10     while(T--) {
11         scanf("%d", &n);
12         if (n > 6 && n & 1)
13             printf("Case #%d: Panda\n", ++t);
14         else if (n < 16)
15             printf("Case #%d: Draw\n", ++t);
16         else
17             printf("Case #%d: Sheep\n", ++t);
18     }
19     return 0;
20 }

猜你喜欢

转载自www.cnblogs.com/fan-jiaming/p/9568741.html
SOS