问题描述

试题编号: 201803-4
试题名称: 棋局评估
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述

  Alice和Bob正在玩井字棋游戏。
  井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先。当同一种棋子占据一行、一列或一条对角线的三个格子时,游戏结束,该种棋子的持有者获胜。当棋盘被填满的时候,游戏结束,双方平手。
  Alice设计了一种对棋局评分的方法:
  - 对于Alice已经获胜的局面,评估得分为(棋盘上的空格子数+1);
  - 对于Bob已经获胜的局面,评估得分为 -(棋盘上的空格子数+1);
  - 对于平局的局面,评估得分为0;

  例如上图中的局面,Alice已经获胜,同时棋盘上有2个空格,所以局面得分为2+1=3。
  由于Alice并不喜欢计算,所以他请教擅长编程的你,如果两人都以最优策略行棋,那么当前局面的最终得分会是多少?

输入格式

  输入的第一行包含一个正整数T,表示数据的组数。
  每组数据输入有3行,每行有3个整数,用空格分隔,分别表示棋盘每个格子的状态。0表示格子为空,1表示格子中为“X”,2表示格子中为“O”。保证不会出现其他状态。
  保证输入的局面合法。(即保证输入的局面可以通过行棋到达,且保证没有双方同时获胜的情况)
  保证输入的局面轮到Alice行棋。

输出格式

  对于每组数据,输出一行一个整数,表示当前局面的得分。

样例输入

3
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

样例输出

3
-4
0

样例说明

  第一组数据:
  Alice将棋子放在左下角(或右下角)后,可以到达问题描述中的局面,得分为3。
  3为Alice行棋后能到达的局面中得分的最大值。
  第二组数据:

  Bob已经获胜(如图),此局面得分为-(3+1)=-4。
  第三组数据:
  井字棋中若双方都采用最优策略,游戏平局,最终得分为0。

数据规模和约定

  对于所有评测用例,1 ≤ T ≤ 5。

问题分析:https://blog.csdn.net/u014296991/article/details/105611011

极大极小值算法:

c++代码:

#include <iostream>#define INF 10
int s[4][4];int minValue(int h);int spaceNum()
{int n = 0;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {if (s[i][j] == 0)++n;}}return n;
}
bool terminalTest()
{if ((s[0][0] != 0 && s[0][0] == s[0][1] && s[0][0] == s[0][2]) ||(s[1][0] != 0 && s[1][0] == s[1][1] && s[1][0] == s[1][2]) ||(s[2][0] != 0 && s[2][0] == s[2][1] && s[2][0] == s[2][2]) ||(s[0][0] != 0 && s[0][0] == s[1][0] && s[0][0] == s[2][0]) ||(s[0][1] != 0 && s[0][1] == s[1][1] && s[0][1] == s[2][1]) ||(s[0][2] != 0 && s[0][2] == s[1][2] && s[0][2] == s[2][2]) ||(s[0][0] != 0 && s[0][0] == s[1][1] && s[0][0] == s[2][2]) ||(s[0][2] != 0 && s[0][2] == s[1][1] && s[0][2] == s[2][0])) {return true;}return false;
}
int maxValue(int h)
{if (terminalTest()) return -(spaceNum() + 1);if (h == 0)return 0;int v = -INF;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {if (s[i][j] == 0) {s[i][j] = 1;int t = minValue(h-1);s[i][j] = 0;if (t > v)v = t;}}}return v;
}
int minValue(int h)
{if (terminalTest()) {return spaceNum() + 1;}if (h == 0)return 0;int v = INF;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {if (s[i][j] == 0) {s[i][j] = 2;int t = maxValue(h - 1);s[i][j] = 0;if (t < v)v = t;}}}return v;
}
int main()
{int n;std::cin >> n;while (n--) {for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {int t;std::cin >> t;s[i][j] = t;}}std::cout << maxValue(spaceNum()) << std::endl;}
}

 剪枝算法 :

c++代码:

#include <iostream>
#include <algorithm>#define INF 10
int s[4][4];int minValue(int h, int alpha, int beta);int spaceNum()
{int n = 0;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {if (s[i][j] == 0)++n;}}return n;
}
bool terminalTest()
{if ((s[0][0] != 0 && s[0][0] == s[0][1] && s[0][0] == s[0][2]) ||(s[1][0] != 0 && s[1][0] == s[1][1] && s[1][0] == s[1][2]) ||(s[2][0] != 0 && s[2][0] == s[2][1] && s[2][0] == s[2][2]) ||(s[0][0] != 0 && s[0][0] == s[1][0] && s[0][0] == s[2][0]) ||(s[0][1] != 0 && s[0][1] == s[1][1] && s[0][1] == s[2][1]) ||(s[0][2] != 0 && s[0][2] == s[1][2] && s[0][2] == s[2][2]) ||(s[0][0] != 0 && s[0][0] == s[1][1] && s[0][0] == s[2][2]) ||(s[0][2] != 0 && s[0][2] == s[1][1] && s[0][2] == s[2][0])) {return true;}return false;
}
int maxValue(int h, int alpha, int beta)
{if (terminalTest()) return -(spaceNum() + 1);if (h == 0)return 0;int v = -INF;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {if (s[i][j] == 0) {s[i][j] = 1;int t = minValue(h-1,alpha,beta);s[i][j] = 0;if (t > v) {v = t;if (v >= beta)return v;alpha = std::max(alpha, v);}}}}return v;
}
int minValue(int h, int alpha, int beta)
{if (terminalTest()) {return spaceNum() + 1;}if (h == 0)return 0;int v = INF;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {if (s[i][j] == 0) {s[i][j] = 2;int t = maxValue(h - 1, alpha, beta);s[i][j] = 0;if (t < v) {v = t;if (v <= alpha)return v;beta = std::min(beta, v);}}}}return v;
}
int main()
{int n;std::cin >> n;while (n--) {for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {int t;std::cin >> t;s[i][j] = t;}}std::cout << maxValue(spaceNum(),-INF,INF) << std::endl;}
}

结果:

第一行为剪枝程序的运行结果,可见,剪枝后时间空间效率大幅提高。

CCF201803-4-棋局评估相关推荐

  1. CCF201803-4 棋局评估(100分)【博弈+DFS】

    试题编号: 201803-4 试题名称: 棋局评估 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3* ...

  2. CCF 201803-4 棋局评估(博弈论)

    题目来源:http://118.190.20.162/view.page?gpid=T70 问题描述 试题编号: 201803-4 试题名称: 棋局评估 时间限制: 1.0s 内存限制: 256.0M ...

  3. CCF 201803 跳一跳 碰撞的小球 url映射 棋局评估

    试题编号: 201803-1 试题名称: 跳一跳 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱. 简化后的跳一跳规则如下: ...

  4. CCF计算机软件能力认证试题练习:201803-4 棋局评估

    棋局评估 来源:CCF 标签: 参考资料: 相似题目: 题目 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X", ...

  5. ccf试题棋局评估c语言,第十三次CCF CSP认证(2018年3月)真题棋局评估 题解

    问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",Alice执 ...

  6. CCF 201803-4棋局评估

    题目描述 问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",A ...

  7. CSP201803-4棋局评估

    问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",Alice执 ...

  8. 201803-4 棋局评估

    问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",Alice执 ...

  9. CCF CSP 201803-4 棋局评估

    #问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",Alice ...

  10. CSP 201803-4 棋局评估

    简单的对抗搜索 评估函数的返回值直接设定成题目中的评估得分即可 在博弈树搜索时,先手返回能向下递归所得的最大值,后手反之返回最小值 如果某种状态已经分出胜负或者平手,就说明该种状态就是博弈树中的叶子节 ...

最新文章

  1. java中JFrame类中函数addWindowListener(new WindowAdapter)
  2. 用koa开发一套内容管理系统(CMS),支持javascript和typescript双语言
  3. 伍迷创意随想集 之 网游与旅游结合新玩法
  4. 一蹴而就的解释是什么_聪明的孩子喜欢问“为什么”,还是喜欢问“为什么”让孩子聪明?...
  5. 计算机体系结构:嵌入式方法_计算机考研——计算机二级学科详解
  6. 构建Spring Boot程序有用的文章
  7. 创建优秀团队文化的四大要点
  8. Java基础学习总结 -- 图形用户界面GUI
  9. 全面屏手机有什么缺点?
  10. java eml文件解析_java 解析 eml的源代码
  11. 今天我们谈一下HTML标签中的map标签的用法和使用场景
  12. 最全的CSS浏览器兼容整理
  13. Day 45 Ansible批量管理
  14. win10共享打印机搜索不到计算机,Win10系统搜不到共享打印机的解决方法
  15. 我还是很喜欢你,像风走了八千里,不问归期
  16. 免费公网动态IP方案
  17. c语言fprintf段错误,fprintf由于突然地址更改导致段错误
  18. WeChatTweak-微信小助手 v1.2.2 详细安装教程
  19. 问什么说我的计算机主机名无效,为什么arcgis的许可管理器 修改为主机时,总是说我输入的是无效主机名...
  20. 新手教程篇-阿里云账号如何注册?

热门文章

  1. office365服务器没有响应,Win10安装Office365时电脑无响应的原因和解决方案
  2. iOS比较好用的第三方框架
  3. linux spec 脚本,RPM包制作之Spec文件详解
  4. N-ary Tree n叉树学习
  5. 《精彩网址大全——生活资讯文体娱乐卷》前言
  6. 选择一个手持式频谱分析仪 需要参考哪些条件
  7. 360 android系统 流量,警惕天价流量费 360手机卫士Android版增流量监控
  8. SAP可配置(VC)的特性相关性简介
  9. 优麒麟linux共享文件夹,循序而渐进,熟读而精思——优麒麟文件管理器篇
  10. 使用Databricks作为分析平台