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游戏中,我们的输入是一个棋局,让我们输出一个移动方向,这样我们需要对棋局进行量化,即我们要评估 ...
随机推荐
- laravel 队列重启
我在job中写了邮件发送 ,线下环境测试是无问题的 ,现在放到线上出现了问题. 问题描述: 部分时候邮件功能可用,部分时间邮件功能不可用. 邮件功能不可用的时候,job发送失败,失败原因是无发送人,打 ...
- SPOJ 8073 The area of the union of circles (圆并入门)
Sphere Online Judge (SPOJ) - Problem CIRU [求圆并的若干种算法,圆并扩展算法]_AekdyCoin的空间_百度空间 参考AekdyCoin的圆并算法解释,根据 ...
- @codeforces - 1106F@ Lunar New Year and a Recursive Sequence
目录 @description@ @solution@ @accepted code@ @details@ @description@ 定义递推数列 f: (1)f[1] = f[2] = ... f ...
- MySQL 8.0 技术详解
MySQL 8.0 简介 MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上 ...
- POJ2186 Popular Cows 题解 强连通分量入门题
题目链接:http://poj.org/problem?id=2186 题目大意: 每头牛都想成为牛群中的红人. 给定N头牛的牛群和M个有序对(A, B),(A, B)表示牛A认为牛B是红人: 该关系 ...
- oracle避免改变索引列的类型
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. 假设 EMPNO是一个数值类型的索引列. SELECT … FROM EMP WHERE EMPNO = ‘123’ 实际上,经 ...
- 洛谷P4860 Roy&October之取石子II 题解 博弈论
题目链接:https://www.luogu.org/problem/P4860 和<P4018 Roy&October之取石子>一样的推导思路,去找循环节. 可以发现:只要不能被 ...
- js 数组的拼接
数组的拼接 var a = [1,2,3,4,5,6]; var b=["foo","bar", "fun"]; 最终的结果是: [ 1,2 ...
- vue 生成 二维码 qrCode 插件 使用 方法
首先安装方法:(--save 参数会改变package.json 推荐使用 下次直接install就行了) npm install --save qrcode 然后项目使用: import QRCod ...
- git clone出现Permission denied (publickey)解决办法
一.错误 git clone git@gitee.com:wangzaiplus/xxx.git, 出现Permission denied (publickey) 二.原因 无权限, 未将公钥添加至G ...