CCF 201803-4 棋局评估
一、 对抗搜索的适用范围
在博弈论题目中,如果决策双方的获胜条件是截然相反的,即一方要求得分越高越好,另一方要求得分越低越好,这时我们就可以用上对抗搜索算法。
二、对抗搜索的主要思想
对抗搜索的核心思想就是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 棋局评估的更多相关文章
- ccf 201803-4 棋局评估(Python实现)
一.原题 问题描述 试题编号: 201803-4 试题名称: 棋局评估 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很 ...
- ccf 201803-4 棋局评估 (对抗搜索)
棋局评估 问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先.当同一种棋子占据一行.一列 ...
- CCF(棋局评估)博弈论+对抗搜索+DFS
201803-4 棋局评估 这题主要使用对抗搜索,也就是每一步寻找可以下棋的位置,通过在这一步下棋看最后会取的什么样的分数. #include<iostream> #include< ...
- 【CCF】棋局评估
博弈论极小极大搜索,记忆化+状压 #include<iostream> #include<cstdio> #include<string> #include< ...
- CCF-CSP题解 201803-4 棋局评估
求当前井字棋局的得分. 用dfs虚构一下搜索树,每个节点对应一个不同的棋局. 每个节点有一个situation()情况评估,若胜负已定,则对应该棋局的评分:否则为0,表示胜负未定或平局. 每个节点还有 ...
- CSP201803-4棋局评估
问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先.当同一种棋子占据一行.一列或一条对角 ...
- 为何谷歌围棋AI AlphaGo可能会把李世石击溃
/* 版权声明:可以随意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 谷歌DeepMind开发的人工智能围棋程序AlphaGo以5:0的压倒性优势击败了欧洲围棋冠军.专业二 ...
- 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,标题翻译为:<用 ...
- 机器学习系列(8)_读《Nature》论文,看AlphaGo养成
作者:viewmode=contents">龙心尘 && viewmode=contents">寒小阳 时间:2016年3月. 出处:http://bl ...
- python 2048游戏控制器
2048游戏控制器 1 evaluate 要用程序来处理就得对现实的问题进行量化,用数字来表示.在2048游戏中,我们的输入是一个棋局,让我们输出一个移动方向,这样我们需要对棋局进行量化,即我们要评估 ...
随机推荐
- Codeforces Round #827 (Div. 4) 复盘+题解
原比赛链接 复盘: ABC签到,手速太慢了. D捣鼓了好久才想起来从更小的值域出发去做. E简单二分答案. 然后就time out了.D题搞错方向浪费太久时间了. F思维题,考虑到初值.字符集,然后是 ...
- CentOS 7安装配置vsftp并搭建FTP(一)
vsftp-VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件.关于这个软件的详细信息 大家可以自行百度. 以上自己安装vsftp系统环境 二.查看自己的服务器是否安装了vsftp ...
- C++ Gui Qt4 第二章
这一章需要使用在控制台使用qmake 使用qmake的时候要先配置qmake的环境变量 找到qmake所在的目录,添加环境变量即可 在使用的时候要先跳转到源文件所在的目录 课本中说qmake可以自动检 ...
- 12组-Alpha冲刺-总结
组长博客链接 https://www.cnblogs.com/147258369k/p/15573118.html 一.基本情况 1.1 现场答辩总结 PPT制作方面略显粗糙,对于产品描述的具体内容不 ...
- Pytorch实战学习(八):基础RNN
<PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili Basic RNN ①用于处理序列数据:时间序列.文本.语音..... ②循环过程中权重共享机制 一.RNN原理 ① X ...
- Access 时间查询 与 SQL SERVER 不一样的几个地方
最近用到了ACCESS 数据库 ,与之前用SQL SERVER 还是有点区别的. 1. 时间 之间 用 # 连接 如下: public static string GetUserInfo(stri ...
- 剑指 Offer II 回溯法
086. 分割回文子字符串 用substr枚举 因为是连续的 不是放与不放的问题 class Solution { public: vector<vector<string>> ...
- Winform窗体中打开PDF文件的三种方式
来源:https://www.jb51.net/article/251451.htm
- 2.mysql存储过程、存储函数与触发器
-- 创建一个存储过程DELIMITER $CREATE PROCEDURE 存储过程名称(返回类型 参数名1 参数类型1, ....) [ ...... ]BEGIN -- 具体组成存储过程的SQL ...
- 计算机科学导论-第三版-学习笔记-chapter2-数字系统
原本看答案的网站被上保护了,我没账号看不了,开摆. 猜测是那边的学生做作业用chatGPT,部分教师觉得不行,禁止使用的同时把答案都上锁了. 也可能是单纯因为我没报课就没账号. 复习题 1.定义一个数 ...