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游戏中,我们的输入是一个棋局,让我们输出一个移动方向,这样我们需要对棋局进行量化,即我们要评估 ...
随机推荐
- [服务器]Windows Server 2008 64位1核1G安装SQL Server2008
本文为原创文章,转载请注明出处!我的博客地址:http://www.cnblogs.com/txwd 这台服务器是2017年初买的,那时候1核1G,3年要1500.不过现在便宜了,2核4G,3年也就1 ...
- jboss单机环境搭建
1.操作系统:centos7 2.需要的包:apache,wildfly,postgres(要初始化),activemq 3.安装流程: 一.安装依赖包并部署服务:httpd,wildfly,mq,p ...
- Kubernetes初识
目录: 云原生 Kubernetes概述 1.K8S是什么 2.为什么要用K8S 3.Kubernetes集群架构与组件 K8S的特性 核心组件 Master组件 配置存储中心 Node组件 Kube ...
- 【服务器数据恢复】VSAN节点容量盘故障离线的数据恢复案例
VSAN简介:VSAN是以vSphere内核为基础开发,可以扩展使用的分布式存储架构.该架构在vSphere集群主机中安硬盘及闪存构建VSAN存储层,通过存储进行管理与控制,最终形成一个共享存储层.V ...
- springcloud(三) - 负载均衡Ribbon
功能介绍 基本保证每个服务不同的ip接收到的请求数量是一样的,确保在微服务下没有没有那个服务器负载过多而另外一个闲置. IRule:根据规则获取制定的服务 规则列表 RoundRobinRule:轮询 ...
- C#判断窗体是否打开,并获取聚焦、未打开则新建一个子窗体
在桌面程序开发会遇到的情况,托盘功能或者是小功能弹窗问题: 现有一个主窗体有子窗体 子窗体每个都可以新建其他窗体问题:新建子窗体时怎么判断子窗体是否打开?若子窗体打开则置顶获取焦点.若未打开则新建一个 ...
- python读取xml格式数据
读取节点文本值和,属性值 # -*- coding: UTF-8 -*- from xml.dom import minidom dom=minidom.parse('F:\\python_proje ...
- django连接ubuntu22下的mysql8
1.安装mysql(这里就不过多赘述了) sudo apt-get install mysql-server 2.登录mysql (1) 在 根目录/etc/mysql/debian.cnf ,使 ...
- dbeaver把表数据导出csv时字符串自动加双引号问题解决
背景: mysql 5.7 dbeaver 21.1.4 解决:如下图,括起字符这里设置一个 空格(space)即可: 参考1
- 移动端wifi测试点总结
1.WiFi功能测试: 验证WiFi模块设置(如:添加AP.静态IP及动态IP的设置等)的相应功能是否正常: 2.WiFi特性专项测试: 1)WiFi打开速度或搜索速度的测试:验证WiFi,WiFi打 ...