解题思路
对于给出的字符串进行深度优先,尝试每一种走法,如果碰到能赢的走法则返回1。如果碰到平局和输的情况则继续尝试,直到尝试完每一种走法。,此外利用动态规划的想法
对搜索过程中的结果进行记录;在搜索前确认是否搜索过这个字符串,如果有记录则直接返回结果。
其实考虑几类可能的情况:
1、当前搜索的字符串已经搜索过了;
2、当前搜索的字符串出现*OL LO* L*L
三种必赢的局面;
3、当前搜索的字符串已经没有空位
4、其余情况依次对空位进行遍历
AC_Code
def dfs(str,n):
if str in dp.keys():
return dp[str]
elif str.find("LOL")!=-1:
return -1
elif str.find("LO*")!=-1:
dp[str] = 1
return 1
elif str.find("L*L")!=-1:
dp[str] = 1
return 1
elif str.find("*OL")!=-1:
dp[str]=1
return 1
elif str.find("*")==-1:
dp[str]=0
return 0
flag = -1
for i in range(n):
strlist = list(str)
if str[i]=='*':
strlist[i] = 'O'
strlist2str = ''.join(strlist)
ret = dfs(strlist2str,n)
#print(strlist2str,ret)
if ret == -1:
dp[str] = 1
return 1
if ret==0:
flag = 0
strlist[i] = 'L'
strlist2str = ''.join(strlist)
ret = dfs(strlist2str, n)
if ret == -1:
dp[str] = 1
return 1
if ret==0:
flag = 0
dp[str]=flag
return dp[str]
n = int(input())
listdata=[]
while n:
n-=1
strdata = input()
listdata.append([strdata,len(strdata)])
for i in listdata:
dp = {}
print(dfs(i[0],i[1]))