填字母游戏(博弈论+DFS)

填字母游戏(博弈论+DFS)

问题描述:

小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说:
  “我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了”。
  K大师在纸上画了一行n个格子,要小明和他交替往其中填入字母。
  并且:
  1. 轮到某人填的时候,只能在某个空格中填入L或O
  2. 谁先让字母组成了“LOL”的字样,谁获胜。
  3. 如果所有格子都填满了,仍无法组成LOL,则平局。
  小明试验了几次都输了,他很惭愧,希望你能用计算机帮他解开这个谜。
输入格式
  第一行,数字n(n<10),表示下面有n个初始局面。
  接下来,n行,每行一个串,表示开始的局面。
填字母游戏(博弈论+DFS)_第1张图片

问题分析:

填字母游戏(博弈论+DFS)_第2张图片

代码实现:

#include 
#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
char chose[2]={'L','O'};
map<string,int>mp;
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;
	}
	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;//平局(先记录下来有可能有更好的情况) 
			}
		}
	}
	if(isping)//如果没有返回1,则判断一下是否平局  平局则返回0 
	{
		mp[str]=0;
		return 0;
	}
	mp[str]=-1;//0和1都没有返回,则表示必输,返回-1 
	return -1;
	
}
int main(int argc, char *argv[]) {

	int n,i;
	cin>>n;
	for(i=0;i<n;i++)
	{
		string str;
		cin>>str;
		cout<<dfs(str)<<endl;
	}

	return 0;
}

你可能感兴趣的:(填字母游戏(博弈论+DFS))