一、 对抗搜索的适用范围

在博弈论题目中,如果决策双方的获胜条件是截然相反的,即一方要求得分越高越好,另一方要求得分越低越好,这时我们就可以用上对抗搜索算法。

二、对抗搜索的主要思想

对抗搜索的核心思想就是dfs遍历一遍博弈树。

不难想到,如果博弈树非常庞大,在不加优化的情况下,对抗搜索的时间效率是十分低下的。

因此,我们就需要对对抗搜索进行一定的优化。

三、对抗搜索的优化

对抗搜索的优化一般来讲有两种:记忆化和Alpha−Beta剪枝 。

https://blog.csdn.net/chenxiaoran666/article/details/82809890

#include <iostream>
//#include <bits/stdc++.h>
#include <string> using namespace std; int isWin(int &score); int M[3][3]; int main()
{
int number;
cin>>number;
for(int k=0;k<number;k++)
{
int score=1;
for(int i=0;i<3;i++)
{
cin>>M[i][0]>>M[i][1]>>M[i][2];
}
int flag=isWin(score);
if(flag==1)
cout<<score;
else if(flag==2)
cout<<"-"<<score;
else
cout<<"0";
cout<<endl;
}
} int isWin(int &score)
{
int flag=0;
for(int i=0;i<3;i++)
{
if(M[i][0]==M[i][1]&&M[i][0]==M[i][2])
{
if(M[i][0]==1)
flag=1;
else if(M[i][0]==2)
flag= 2;
}
else if(M[i][0]!=2&&M[i][1]!=2&&M[i][2]!=2&&M[i][0]+M[i][1]+M[i][2]==2)
{
flag=1;
score--;
} }
for(int i=0;i<3;i++)
{
if(M[0][i]==M[1][i]&&M[0][i]==M[2][i])
{
if(M[0][i]==1)
flag= 1;
else if(M[0][i]==2)
flag= 2;
}
else if(M[0][i]!=2&&M[1][i]!=2&&M[2][i]!=2&&M[0][i]+M[1][i]+M[2][i]==2)
{
flag=1;
score--;
} }
if( (M[0][0]==M[1][1]&&M[1][1]==M[2][2]) ||(M[2][0]==M[1][1]&&M[1][1]==M[0][2]) )
{
if(M[1][1]==1)
flag= 1;
else if(M[1][1]==2)
flag= 2;
}
else if((M[0][0]!=2&&M[1][1]!=2&&M[2][2]!=2&&M[0][0]+M[1][1]+M[2][2]==2) ||(M[2][0]!=2&&M[1][1]!=2&&M[0][2]!=2&&M[2][0]+M[1][1]+M[0][2]==2) )
{
flag=1;
score--;
}
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(M[i][j]==0)
score++;
}
}
return flag;
}
#include <iostream>
//#include <bits/stdc++.h>
#include <string> using namespace std; int mp[4][4];
bool hok(int h,int f)
{
return mp[h][0]==f&&mp[h][0]==mp[h][1]&&mp[h][1]==mp[h][2]; //判断行是否三颗相连
}
bool lok(int l,int f)
{
return mp[0][l]==f&&mp[0][l]==mp[1][l]&&mp[1][l]==mp[2][l]; //判断列是否三颗相连
}
int spa()
{
int res=0;
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
if(!mp[i][j])res++;
return res;
}
int win(int f) //判断当前局面胜负情况
{
int wi=0,ans=1;
if(hok(0,f)||hok(1,f)||hok(2,f))wi=1;
if(lok(0,f)||lok(1,f)||lok(2,f))wi=1;
if(mp[0][0]==f&&mp[0][0]==mp[1][1]&&mp[1][1]==mp[2][2])wi=1;
if(mp[0][2]==f&&mp[0][2]==mp[1][1]&&mp[1][1]==mp[2][0])wi=1;
if(!wi)return 0;
ans+=spa();
return (f==1)?ans:-ans;
}
int dfs(int peo) //对抗搜索
{
if(!spa())return 0;
int Max=-10,Min=10;
for(int i=0; i<3; i++)
{
for(int j=0,w; j<3; j++)
{
if(!mp[i][j]) //未放子处 //枚举可以落棋的位置
{
mp[i][j]=peo+1;
w=win(peo+1);
if(w)//分出胜负
{
mp[i][j]=0;
return w>0?max(Max,w):min(Min,w);
}
if(!peo)Max=max(Max,dfs(1));//递归
else Min=min(Min,dfs(0));
mp[i][j]=0;
}
}
}
return peo?Min:Max; //0-Alice-Max,1-Bob-Min
}
int main()
{
int t;
cin>>t;
while(t--)
{
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
cin>>mp[i][j];
int x=win(1),y=win(2);
if(x)
{
cout<<x<<endl;
continue;
}
if(y)
{
cout<<y<<endl;
continue;
}
cout<<dfs(0)<<endl; //0表示Alice下,1表示Bob下
}
return 0;
}

  

CCF 201803-4 棋局评估的更多相关文章

  1. ccf 201803-4 棋局评估(Python实现)

    一.原题 问题描述 试题编号: 201803-4 试题名称: 棋局评估 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很 ...

  2. ccf 201803-4 棋局评估 (对抗搜索)

    棋局评估 问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先.当同一种棋子占据一行.一列 ...

  3. CCF(棋局评估)博弈论+对抗搜索+DFS

    201803-4 棋局评估 这题主要使用对抗搜索,也就是每一步寻找可以下棋的位置,通过在这一步下棋看最后会取的什么样的分数. #include<iostream> #include< ...

  4. 【CCF】棋局评估

    博弈论极小极大搜索,记忆化+状压 #include<iostream> #include<cstdio> #include<string> #include< ...

  5. CCF-CSP题解 201803-4 棋局评估

    求当前井字棋局的得分. 用dfs虚构一下搜索树,每个节点对应一个不同的棋局. 每个节点有一个situation()情况评估,若胜负已定,则对应该棋局的评分:否则为0,表示胜负未定或平局. 每个节点还有 ...

  6. CSP201803-4棋局评估

    问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先.当同一种棋子占据一行.一列或一条对角 ...

  7. 为何谷歌围棋AI AlphaGo可能会把李世石击溃

    /* 版权声明:可以随意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 谷歌DeepMind开发的人工智能围棋程序AlphaGo以5:0的压倒性优势击败了欧洲围棋冠军.专业二 ...

  8. AlphaGo论文的译文,用深度神经网络和树搜索征服围棋:Mastering the game of Go with deep neural networks and tree search

    转载请声明 http://blog.csdn.net/u013390476/article/details/50925347 前言: 围棋的英文是 the game of Go,标题翻译为:<用 ...

  9. 机器学习系列(8)_读《Nature》论文,看AlphaGo养成

    作者:viewmode=contents">龙心尘 && viewmode=contents">寒小阳 时间:2016年3月. 出处:http://bl ...

  10. python 2048游戏控制器

    2048游戏控制器 1 evaluate 要用程序来处理就得对现实的问题进行量化,用数字来表示.在2048游戏中,我们的输入是一个棋局,让我们输出一个移动方向,这样我们需要对棋局进行量化,即我们要评估 ...

随机推荐

  1. QT-groupBox组件内的组件失去交互功能

    属性设置: 首先 然后 可以实现.

  2. mac使用expect登录跳板机后的机器

    两个文档 #!/usr/bin/expect -f #连接文件名字记录 set ip [lindex $argv 0] catch {spawn ssh 1.1.1.1}## ip地址换成自己的 ex ...

  3. Java基础-类型转换、变量、变量命名规范

    类型转换 强制转换 (类型)变量名 高-->低 自动转换 低-->高 注意点 不能对布尔值进行转换 不能把对象类型转换为不相干的类型 在把高容量转换到低容量的时候,强制转换 转换的时候可能 ...

  4. Power shell 读取电量,改变屏幕亮度

    1. Get-Wmiobject  -List win32*  # 列出所有win32_信息(基本的BIOS,Battery , Memory, processor) 2.Get-WmiObject ...

  5. 使用layui+jQuery实现点击删除单行数据

    使用layui+jQuery实现点击删除单行数据 首先要用到layui的官网手册 地址:https://www.layui.com/ 注意1.  此功能是在使用layui展示数据的基础上实现 3.  ...

  6. centos7.8 安装 redis5.0.2

    1.安装gcc依赖 redis是由C语言开发,因此安装之前必须要确保服务器已经安装了gcc,可以通过如下命令查看机器是否安装: gcc -v 如果没有安装则通过以下命令安装: yum install ...

  7. Salesforce Connect 连接两个不同的Org(实际设置方法)

    利用Salesforce的标准功能:Salesforce Connect,可以轻松的将两个组织(Org)连接起来.实现Object的共享(包括参照和编辑). 要求: ①两个组织必须是开发者Edtion ...

  8. JSONObject.parseObject syntax error,expect START WITH { OR [,but actually START WITH error

    JSONObject.parseObject syntax error,expect START WITH { OR [,but actually START WITH error解析JSON出现异常 ...

  9. 从零搭建hadoop集群之节点间免密登录

    我这里有三台虚拟机 分别是 hadoop01 hadoop02 hadoop03 1.所有节点切入到hadoop用户 2.分别再三个节点上输入 ssh-keygen 命令(输入命令后敲回车键三下)  ...

  10. grep 查找字符串 在文件或者文件夹中

    1, 命令行能做的事情很多, grep 'XXX' ./access.log 当前某个文件下下查找某个字符串grep 'xxx' ./ -r 当前目录文件夹下查找某个字符串