CCF-棋局评估 201803-04(版本 2.0)------(之前写了一个臃肿的1.0版 ,还沾沾自喜 233)
核心 : 博弈搜索树
双方得分互为相反数
dfs (x,y,player): 玩家player下完(x,y)之后的得分最大值
易错: 先判断输赢,再判断平局
待改进: check() 函数写的还是太臃肿了 233
#include <bits/stdc++.h>
using namespace std;
const int N = ;
int mp[][];
int check () {
int num=;
for (int i=;i<=N;i++)
for (int j=;j<=N;j++)
if (mp[i][j]==) num++;
for (int i=;i<=;i++) {
int x=mp[i][];
if (x==) continue;
for (int j=;j<=;j++) {
if (mp[i][j]!=x)
break;
if (j==)
return num+;
}
}
for (int i=;i<=;i++) {
int x=mp[][i];
if (x==) continue;
for (int j=;j<=;j++) {
if (mp[j][i]!=x)
break;
if (j==)
return num+;
}
}
int x=mp[][];
if (x&&mp[][]==mp[][]&&mp[][]==mp[][]) return num+;
x=mp[][];
if (x&&mp[][]==mp[][]&&mp[][]==mp[][]) return num+;
if (num==) return ;
return -;
}
int dfs (int x, int y, int player) {
mp[x][y] = player;
int k = check();
if (k >= ) {
mp[x][y] = ;
return k;
}
int ans = -;
for (int i = ; i <= N; i++)
for (int j = ; j <= N; j++) {
if (!mp[i][j])
ans = max (ans, dfs(i, j, ( (player - ) ^ ) + ) );
}
mp[x][y]=;
return -ans;
}
int main ()
{
int T;
scanf ("%d", &T);
while (T--) {
for (int i = ; i <= N; i++)
for (int j = ; j <= N; j++)
scanf ("%d", &mp[i][j]);
int k=check ();
if (k>=) {
printf("%d\n",-k);
continue;
}
int ans = -;
for (int i = ; i <= N; i++)
for (int j = ; j <= N; j++)
if (!mp[i][j])
ans = max (dfs(i, j, ), ans);
printf ("%d\n", ans);
}
return ;
}
CCF-棋局评估 201803-04(版本 2.0)------(之前写了一个臃肿的1.0版 ,还沾沾自喜 233)的更多相关文章
- 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< ...
- ubuntu10.04版本下android源码的编译
首先是网址:http://software.intel.com/en-us/blogs/2012/03/06/hands-on-notesbuild-android-x86-ics-4-virtual ...
- Ubuntu 17.04版本下,opencv进行源码编译安装
本文主要针对Ubuntu 17.04版本下,opencv进行源码编译安装.开发环境主要针对python 对 openCV库的调用. 安装 gcc cmake 编译环境 sudo apt-get ins ...
- 记录ubuntu16.04版本安装过程中遇到的问题
记录ubuntu16.04版本安装和使用过程中遇到的些问题,方便以后查看,主要内容有: 1. ubuntu源替换 2. windows与vmware ubuntu文件夹共享 3. putty连接ubu ...
- CCF-CSP题解 201803-4 棋局评估
求当前井字棋局的得分. 用dfs虚构一下搜索树,每个节点对应一个不同的棋局. 每个节点有一个situation()情况评估,若胜负已定,则对应该棋局的评分:否则为0,表示胜负未定或平局. 每个节点还有 ...
- 安装Ubuntu14.04版本的操作系统
1:安装好虚拟机之后便是安装操作系统,操作系统分为好多种,在这里笔者使用的是Ubuntu14.04版本的操作系统,除此之后还可以使用fedora或者小红帽等等操作系统 软件包http://pan.ba ...
- 其它综合-VMware虚拟机安装Ubuntu 19.04 版本
Ubuntu 19.04 版本安装过程 1. 环境: 使用的虚拟机软件是VMware,版本为 12 .(网上一搜一大推,在此不再演示.) 使用的 ISO镜像为Ubuntu 19.04.(自己也可以在网 ...
随机推荐
- 针对unicode对象---检测字符串是否只由数字组成
- pre强制 自动换行
转自:http://www.16sucai.com/2010/10/941.html <pre> 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会 ...
- Ubuntu16.10下mysql5.7的安装及远程访问配置
如何安装mysql 1.sudo apt-get update,如果很慢或者失败,需要在软件和更新中选择最佳服务器,勾选所有互联网下载选项及去掉其他软件所有勾选项 2.sudo apt-get upg ...
- 延时显示(类QQ头像显示)
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- Java冒泡排序与选择排序
Java排序: 一.冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. ...
- 【转】caffe数据层及参数
原文: 要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个层(layer)构成,每一层又由许多参数组成.所有的参数都定义在caffe.proto ...
- JVM运行时内存区域
JVM运行java程序时会将内存划分为若干个不同的数据区域: (1)程序计数器: 1.占用内存空间不大. 2.程序计数器相当于JVM所执行的字节码(jvm指令)的“行号指示器”,通过程序计数器的“值” ...
- pytorch加载和保存模型
在模型完成训练后,我们需要将训练好的模型保存为一个文件供测试使用,或者因为一些原因我们需要继续之前的状态训练之前保存的模型,那么如何在PyTorch中保存和恢复模型呢? 方法一(推荐): 第一种方法也 ...
- 7.2 C++模板类实例化
参考:http://www.weixueyuan.net/view/6399.html 总结: array < int >表明用int类型来代替模板类中的类参数“T”,编译器会将模板类ar ...
- 7 Serial Configuration 理解(二)
*Serial Configuration Mode 串行配置模式分为:Master Serial 和 Slave Serial (如下图)两类: 两者的区别在与CCLK的输入输出方向:主动模式下为输 ...