解法模版
相关例题
问题描述
小明经常玩 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
代码实现
#include<iostream>
#include<map>
#include<cstring>
using namespace std;
map<string,int> mp;
char chose[2]={'L','O'};
int dfs(string str){
if(mp.find(str)!=mp.end()){
return mp[str];
}
//胜利
if(str.find("LO*")!=-1 || str.find("*OL")!=-1 || str.find("L*L")!=-1){
mp[str]=1;
return 1;
}
//最后结果:没有*,没有LOL,返回平局
if(str.find("*")==-1 && str.find("LOL")==-1 ){
mp[str]=0;
return 0;
}
int isping=0;//
for(int i=0;i<str.length();i++){
if(str[i]=='*'){
for(int j=0;j<2;j++){
str[i]=chose[j];//尝试填入
//如果尝试之后造成以下局面---输
if(str.find("LO*")!=-1||str.find("*OL")!=-1||str.find("L*L")!=-1){
str[i]='*';//如果新局面导致对手会赢则不可取,还原局面
continue;
}
int flag=dfs(str);//模拟 让对手填,记录结果
str[i]='*';
if(flag==1){
continue;
}else if(flag==-1){
return 1;
}else if(flag==0){
isping=1;
}
}
}
}
//如果没有返回1,则判断一下是否平局 平局则返回0
if(isping){
mp[str]=0;
return 0;
}
//0和1都没有返回,则表示必输,返回-1
mp[str]=-1;
return -1;
}
int main(){
int n;
cin>>n;
string str;
for(int i=0;i<n;i++){
cin>>str;
cout<<dfs(str)<<endl;
}
return 0;
}
参考内容:https://www.it610.com/article/1297911320301084672.htm