CSP201803-4棋局评估
井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先。当同一种棋子占据一行、一列或一条对角线的三个格子时,游戏结束,该种棋子的持有者获胜。当棋盘被填满的时候,游戏结束,双方平手。
Alice设计了一种对棋局评分的方法:
- 对于Alice已经获胜的局面,评估得分为(棋盘上的空格子数+1);
- 对于Bob已经获胜的局面,评估得分为 -(棋盘上的空格子数+1);
- 对于平局的局面,评估得分为0;
例如上图中的局面,Alice已经获胜,同时棋盘上有2个空格,所以局面得分为2+1=3。
由于Alice并不喜欢计算,所以他请教擅长编程的你,如果两人都以最优策略行棋,那么当前局面的最终得分会是多少?
每组数据输入有3行,每行有3个整数,用空格分隔,分别表示棋盘每个格子的状态。0表示格子为空,1表示格子中为“X”,2表示格子中为“O”。保证不会出现其他状态。
保证输入的局面合法。(即保证输入的局面可以通过行棋到达,且保证没有双方同时获胜的情况)
保证输入的局面轮到Alice行棋。
1 2 1
2 1 2
0 0 0
2 1 1
0 2 1
0 0 2
0 0 0
0 0 0
0 0 0
-4
0
Alice将棋子放在左下角(或右下角)后,可以到达问题描述中的局面,得分为3。
3为Alice行棋后能到达的局面中得分的最大值。
第二组数据:
Bob已经获胜(如图),此局面得分为-(3+1)=-4。
第三组数据:
井字棋中若双方都采用最优策略,游戏平局,最终得分为0。
双方均使用最优策略,所以Alice会去寻找当前局面所有着法中使分数最大的着法,Bob会去寻找当前局面中所有着法使分数最小的着法。
使用com函数递归查找,得到结果后在数组中记录该着法得到的局面的分数,再寻找里面的最值,由形参中注明当前局面轮到谁走棋决定寻找最大值或最小值。
#include<iostream>
using namespace std;
int lef (int a[]){//¼ÆËãÆåÅÌÉÏ»¹ÓжàÉÙ¿Õ°×λ
int i=,flag=;
for(;i<;i++){
if(a[i]==){
flag++;
}
}
return flag;
}
int show(int a[]){//´òÓ¡Æå¾Ö
for(int i=;i<;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return ;
}
int win1(int a[]){//ÅжÏʤ¸º£¬Èç¹ûûÓÐÃ÷È·½á¹û·µ»Ø0
if((a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]*a[]*a[]==) ||
(a[]*a[]*a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ){
return ;
}else if((a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ||
(a[]*a[]*a[]==) ){
return ;
}else return ;
}
int com(int a[],int b){
if(win1(a)==){
return lef(a)+;
}else if (win1(a)==) {
return -lef(a)-;}
if(lef(a)==){
return ;
}
int k,j,c[],d[],mmm=-;//ÓÃÊý×écÀ´±£´æµ±Ç°¾ÖÃæÒԱ㸴ԣ¬Êý×éd±£´æµÃ·ÖÇé¿ö
for(k=;k<;k++){
c[k]=a[k];
d[k]=;
}
if(b==){
for(j=;j<;j++){
if(c[j]==){
c[j]=;
d[j]=com(c,);
c[j]=;
}
}
for(k=;k<;k++){
if(d[k]>=mmm && c[k]==){
mmm=d[k];
}
}
return mmm;
}else if (b==){
mmm=;
for(j=;j<;j++){
if(c[j]==){
c[j]=;
d[j]=com(c,);
c[j]=;
}
}
for(k=;k<;k++){
if(d[k]<=mmm && c[k]==){
mmm=d[k]; }
}
return mmm;
}
return ;
}
int main(){
int i,k,l,t;
cin>>t;
int data[],result[];
for (i=;i<t;i++){
for(k=;k<;k++){
cin>>data[k];
}
result[i]=com(data,);
}
for(i=;i<t;i++){
cout<<result[i]<<endl;
}
return ;
}
CSP201803-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-CSP题解 201803-4 棋局评估
求当前井字棋局的得分. 用dfs虚构一下搜索树,每个节点对应一个不同的棋局. 每个节点有一个situation()情况评估,若胜负已定,则对应该棋局的评分:否则为0,表示胜负未定或平局. 每个节点还有 ...
- 【CCF】棋局评估
博弈论极小极大搜索,记忆化+状压 #include<iostream> #include<cstdio> #include<string> #include< ...
- 为何谷歌围棋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游戏中,我们的输入是一个棋局,让我们输出一个移动方向,这样我们需要对棋局进行量化,即我们要评估 ...
随机推荐
- YUI css reset
*{ margin:0; padding:0; } 以前写CSS都会在会在样式的开头部分添加上述的内容,今天才发现这种写法很不友好,会导致很多样式显示问题,所以并不适合所有的浏览器. 下面的是雅虎的c ...
- 现代IM系统中的消息系统架构 - 模型篇
前言 在架构篇中我们介绍了现代IM消息系统的架构,介绍了Timeline的抽象模型以及基于Timeline模型构建的一个支持『消息漫游』.『多端同步』和『消息检索』多种高级功能的消息系统的典型架构.架 ...
- day7_python之面向对象高级-反射
反射:通过字符串去找到真实的属性,然后去进行操作 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 1.两种方法访问对象的属性 cl ...
- eclipse maven项目导出所使用的jar包
在eclipse中定位到maven项目的pom.xml文件右击pom.xml文件,选择Run As-->Maven build…在打开的页面中,GOLAS栏输入“dependency:copy- ...
- 2018-8-10-WPF-使用-VisualStudio-2017-项目文件
title author date CreateTime categories WPF 使用 VisualStudio 2017 项目文件 lindexi 2018-08-10 19:16:53 +0 ...
- 数据采集之js埋点
一.后台nginx环境搭建 web点数据采集后台配置nginx:https://blog.csdn.net/weixin_37490221/article/details/80894827 下载数据源 ...
- Spring的注解@Qualifier注解
@Qualifier注解了,qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称 ...
- CSS 实现单行及多行文字省略
单行文字省略 很多时候不确定字数限制,但换行可能影响整体设计,这个时候常用就是文字省略加全文字提示了 .dom{ text-overflow: ellipsis; overflow: hidden; ...
- 整理了一下angularJs的webpack模板
github地址:https://github.com/qianxiaoning/demo-angularJs1.7.5 欢迎大家star或者fork呀~ 目录结构 src/ components/ ...
- UVA 1347"Tour"(经典DP)
传送门 参考资料: [1]:紫书 题意: 欧几里得距离???? 题解: AC代码: #include<bits/stdc++.h> using namespace std; ; int n ...