大意
给定一个01回文串
规则如下:
(1)先手必须把不是1的数换成1
(2)如果不是回文串可以对其进行翻转
(3)对方翻转了,你这次就不能翻转,只能进行换数
(4)最终串全变成1,则游戏结束
思路
思维题,给得很巧,存在三种情况:
(1)如果全是1,平局
(2)最特殊的情况是,串中0个数 i >= 3,串中间有个0
(3)其他情况都是先手胜
先手可以把中间的0换为1,还是回文串,
e.g. 000 变成 010,那么后手只能变110(011)
先手翻转,后手只能+1,先手获胜
code1
一位大佬的代码
#include <stdio.h>
#include<cstdio>
#include <iostream>
using namespace std;
int t;
int n;
int main()
{
scanf("%d",&t);
while (t --)
{
int sum = 0;
scanf("%d",&n);
for (int i = 1;i <= n;i ++)
{
char c;
cin >> c;
if(c=='0') ++sum;
}
if (sum % 2)
{
if (sum == 1)
printf("BOB\n");
else printf("ALICE\n");
continue;
}
if (sum == 0)
printf("DRAW\n");
else printf("BOB\n");
}
return 0;
}
code2
#include<cstdio>
using namespace std;
int t;
int n;
int main()
{
scanf("%d",&t);
while (t --)
{
int sum = 0;
scanf("%d",&n);
for (int i = 1;i <= n;i ++)
{
char c = getchar();
while (c != '0' && c != '1') //没有这句,则少读一个数
c = getchar();
if (c == '0')
++sum;
}
if (sum % 2)
{
if (sum == 1)
printf("BOB\n");
else printf("ALICE\n");
continue;
}
if (sum == 0)
printf("DRAW\n");
else printf("BOB\n");
}
return 0;
}