历届试题 填字母游戏

资源限制
时间限制: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

思路:

  1. 排除含 L0* , *0L , L*L,这些必赢情况;
  2. 若字符串中含 L**L,则先填的人必输,所以问题转换为构造出这个式子后其他格子谁先填完谁胜利;
    如:
    L***L ······ LL**L
  3. 一般填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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值