700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 8届国赛java试题 5: 填字母游戏

8届国赛java试题 5: 填字母游戏

时间:2024-04-24 23:02:36

相关推荐

8届国赛java试题 5: 填字母游戏

填字母游戏

小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说:“我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了”。K大师在纸上画了一行n个格子,要小明和他交替往其中填入字母。

并且:

轮到某人填的时候,只能在某个空格中填入L或O。谁先让字母组成了“LOL”的字样,谁获胜。如果所有格子都填满了,仍无法组成LOL,则平局。

小明试验了几次都输了,他很惭愧,希望你能用计算机帮他解开这个谜。

本题的输入格式为:

第一行,数字n(n<10),表示下面有n个初始局面。接下来,n行,每行一个串,表示开始的局面。

比如:“******”, 表示有6个空格。 “L****”, 表示左边是一个字母L,它的右边是4个空格。要求输出n个数字,表示对每个局面,如果小明先填,当K大师总是用最强着法的时候,小明的最好结果。1 表示能赢-1 表示必输0 表示可以逼平

例如,

输入:

4***L**LL**L***LL*****L

则程序应该输出:

0

-1

1

1

思路:

这到题是博弈题我们可以用一个字典把之前知道的结果存储起来,以便减少深搜的时间复杂度,减少程序运行时间。博弈问题形式基本就是前面的框架是判断输赢的条件,for就是遍历各种走法,一直使得小明为最好的结果。if s in d:就是判断是否之前知道最优解。但蓝桥杯只能通过60分。

程序:

def me(w):global ds="".join(w)if s in d:return d[s]if s.count("LOL")>0:return -1if len(s)<3 or s.count("*")==0: return 0c=-1for i in range(0,len(w)):if w[i]=="*":try:w[i]="L"#试着填Lc=max(c,-me(w))if c==1:breakelse:w[i]="O"#试着填Oc=max(c,-me(w))if c==1:breakfinally:w[i]="*"#回溯s="".join(w)d[s]=creturn cw=int(input())w1=[input() for i in range(w)]for i in w1:d={}print(me(list(i)))

禁止转载。仅用于自己学习。对程序错误不负责。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。