L - SOS Gym - 101775L 博弈
题目链接:https://cn.vjudge.net/contest/274151#problem/L
题目大意:给你一个1*n的方格,两个人轮流放字母,每一次可以放"S"或者"O",问你谁最先构成"SOS".
具体思路:首先找到必胜态,"S_ _S".这种时候,在其他地方都已经放满的情况下,无论第一个人怎么下,都是第二个人赢.然后要想构造出这种的情况长度就至少为7.然后就开始看谁先能构造出这个东西了.
当长度大于等于7并且是奇数的时候,这个时候先手必赢.
当长度是偶数的时候,如果第一次是先手先放一个S的话,后手肯定能比先手先构造出必胜态,
所以说就开始讨论先手不放S.
如果先手不先放S,要是想赢就必须长度为偶数,并且当第一次放入棋子之后,至少有连续的7个空白的还可以放旗子,第一次先手先放置一个0,然后这个时候后手就会再放一个然后这个时候就开始往长度是偶数的时候想,这个时候 "先手" 就相当于 长度是偶数的 时候的"后手" 所以这种时候先手胜.
AC代码:
1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #include<stdio.h> 6 #include<queue> 7 using namespace std; 8 # define ll long long 9 # define inf 0x3f3f3f3f 10 const int maxn = 100000+100; 11 # define mod 1000000007 12 int main() 13 { 14 int T; 15 int Case=0; 16 scanf("%d",&T); 17 while(T--) 18 { 19 int n; 20 scanf("%d",&n); 21 if(n>=16&&n%2==0)printf("Case #%d: Sheep\n",++Case); 22 else if(n%2!=0&&n>=7) printf("Case #%d: Panda\n",++Case); 23 else printf("Case #%d: Draw\n",++Case); 24 } 25 return 0; 26 } 27