资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说:
“我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了”。
K大师在纸上画了一行n个格子,要小明和他交替往其中填入字母。
并且:
1. 轮到某人填的时候,只能在某个空格中填入L或O
2. 谁先让字母组成了“LOL”的字样,谁获胜。
3. 如果所有格子都填满了,仍无法组成LOL,则平局。
小明试验了几次都输了,他很惭愧,希望你能用计算机帮他解开这个谜。
输入格式
第一行,数字n(n<10),表示下面有n个初始局面。
接下来,n行,每行一个串,表示开始的局面。
比如:“**”, 表示有6个空格。“L”, 表示左边是一个字母L,它的右边是4个空格。
输出格式
要求输出n个数字,表示对每个局面,如果小明先填,当K大师总是用最强着法的时候,小明的最好结果。
1 表示能赢
-1 表示必输
0 表示可以逼平
样例输入
4
***
L**L
L**L***L
L*****L
样例输出
0
-1
1
1
思路:
- 排除含 L0* , *0L , L*L,这些必赢情况;
- 若字符串中含 L**L,则先填的人必输,所以问题转换为构造出这个式子后其他格子谁先填完谁胜利;
如:
L***L ······ LL**L - 一般填0会导致3个格子无效
代码:
#include <stdio.h>
int main(){
int n;
char ch[1000];
int pan=0,pan1=0,pan2=0,pan3,pan4,i,j,k;
scanf("%d",&n);
for (k=0;k<n;k++){
pan = 0;//统计*个数
pan1 = 0;//统计L***或***L个数
pan2 = 0;//帮助L***统计
pan3 = 0;//判断是否有L**L
pan4 = 0;//判断是否有L0*或*0L或L*L
scanf("%s",ch);
for (i=0;ch[i]!='\0';i++){
if(ch[i]=='*'){
pan++;
}
if(ch[i]=='L'){
if(ch[i+1]!='\0'&&ch[i+2]!='\0'&&ch[i+3]!='\0'){
if(ch[i+1]=='*'&&ch[i+2]=='*'&&ch[i+3]=='*'&& ch[i+4]!='0'&&ch[i+5]!='L') pan1++;
if(ch[i+1]=='*'&&ch[i+2]=='*'&&ch[i+3]=='L') pan3=1;
//printf("%c%c%c",ch[i+1],ch[i+2],ch[i+3]);
}
if(i>=3&&ch[i-1]=='*'&&ch[i-2]=='*'&&ch[i-3]=='*'){
if(i>=4&&ch[i-4]!='0'){
pan2 = 1;
for (j=i-4;j>=0&&i-j<=8;j--){
if(ch[j]=='L'){
pan2 = 0;
break;
}
if(ch[j]=='0') break;
}
if(pan2==1) pan1++;
}
}
if((ch[i+1]=='*'&&ch[i+2]=='L') || (ch[i+1]=='0'&&ch[i+2]=='*') || (i-2>=0&&ch[i-1]=='0'&&ch[i-2]=='*')) pan4 = 1;
}
}
//printf("pan=%d pan1=%d pan2=%d pan3=%d pan4=%d\n",pan,pan1,pan2,pan3,pan4);
if(pan4==1) printf("1\n");
else{
if(pan3==1){
if(pan%2==1)printf("1\n");
else printf("-1\n");
}
else{
if(pan%2==1&&pan1>=1)printf("1\n");
else if(pan%2==0&&pan1>1)printf("-1\n");
else if(pan%2==0&&pan1<=1) printf("0\n");
else if(pan1==0) printf("0\n");
}
}
}
return 0;
}