填字母游戏
博弈+dfs
#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表示有可能平局,返回0if(ping) return m[s]=0;//否则返回-1return 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;
}