填字母游戏
博弈+dfs
cpp
#include<iostream>
#include<map>
using namespace std;
//要用map存储已经处理过的字符串不然会超时
map<string,int> m;
//dfs返回的就是结果
int dfs(string s)
{
//剪枝
if(m.find(s)!=m.end()) return m[s];
//找到LOL代表输了
if(s.find("LOL")!=string::npos) return m[s]=-1;
//找不到空位表示平局
if(s.find("*")==string::npos) return m[s]=0;
int ping=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='*')
{
s[i]='L';
if(dfs(s)==-1)
{
//要回溯后才能存到m中
s[i]='*';
return m[s]=1;
}
if(dfs(s)==0) ping=1;
s[i]='O';
if(dfs(s)==-1)
{
s[i]='*';
return m[s]=1;
}
if(dfs(s)==0) ping=1;
s[i]='*';
}
}
//ping不为0表示有可能平局,返回0
if(ping) return m[s]=0;
//否则返回-1
return m[s]=-1;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string s;
cin>>s;
cout<<dfs(s)<<endl;
}
return 0;
}