lol if:蓝桥杯算法练习笔记(14)__博弈问题

解法模版

相关例题

填字母游戏

问题描述

小明经常玩 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 表示可以逼平

样例输入

4L**LL**L***LL*****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

相关推荐

相关文章