CCF201803-4-棋局评估
问题描述
试题编号: | 201803-4 |
试题名称: | 棋局评估 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述 Alice和Bob正在玩井字棋游戏。 例如上图中的局面,Alice已经获胜,同时棋盘上有2个空格,所以局面得分为2+1=3。 输入格式 输入的第一行包含一个正整数T,表示数据的组数。 输出格式 对于每组数据,输出一行一个整数,表示当前局面的得分。 样例输入 3 样例输出 3 样例说明 第一组数据: Bob已经获胜(如图),此局面得分为-(3+1)=-4。 数据规模和约定 对于所有评测用例,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-棋局评估相关推荐
- CCF201803-4 棋局评估(100分)【博弈+DFS】
试题编号: 201803-4 试题名称: 棋局评估 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3* ...
- CCF 201803-4 棋局评估(博弈论)
题目来源:http://118.190.20.162/view.page?gpid=T70 问题描述 试题编号: 201803-4 试题名称: 棋局评估 时间限制: 1.0s 内存限制: 256.0M ...
- CCF 201803 跳一跳 碰撞的小球 url映射 棋局评估
试题编号: 201803-1 试题名称: 跳一跳 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱. 简化后的跳一跳规则如下: ...
- CCF计算机软件能力认证试题练习:201803-4 棋局评估
棋局评估 来源:CCF 标签: 参考资料: 相似题目: 题目 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X", ...
- ccf试题棋局评估c语言,第十三次CCF CSP认证(2018年3月)真题棋局评估 题解
问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",Alice执 ...
- CCF 201803-4棋局评估
题目描述 问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",A ...
- CSP201803-4棋局评估
问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",Alice执 ...
- 201803-4 棋局评估
问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",Alice执 ...
- CCF CSP 201803-4 棋局评估
#问题描述 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X",Bob放的是"O",Alice ...
- CSP 201803-4 棋局评估
简单的对抗搜索 评估函数的返回值直接设定成题目中的评估得分即可 在博弈树搜索时,先手返回能向下递归所得的最大值,后手反之返回最小值 如果某种状态已经分出胜负或者平手,就说明该种状态就是博弈树中的叶子节 ...
最新文章
- java中JFrame类中函数addWindowListener(new WindowAdapter)
- 用koa开发一套内容管理系统(CMS),支持javascript和typescript双语言
- 伍迷创意随想集 之 网游与旅游结合新玩法
- 一蹴而就的解释是什么_聪明的孩子喜欢问“为什么”,还是喜欢问“为什么”让孩子聪明?...
- 计算机体系结构:嵌入式方法_计算机考研——计算机二级学科详解
- 构建Spring Boot程序有用的文章
- 创建优秀团队文化的四大要点
- Java基础学习总结 -- 图形用户界面GUI
- 全面屏手机有什么缺点?
- java eml文件解析_java 解析 eml的源代码
- 今天我们谈一下HTML标签中的map标签的用法和使用场景
- 最全的CSS浏览器兼容整理
- Day 45 Ansible批量管理
- win10共享打印机搜索不到计算机,Win10系统搜不到共享打印机的解决方法
- 我还是很喜欢你,像风走了八千里,不问归期
- 免费公网动态IP方案
- c语言fprintf段错误,fprintf由于突然地址更改导致段错误
- WeChatTweak-微信小助手 v1.2.2 详细安装教程
- 问什么说我的计算机主机名无效,为什么arcgis的许可管理器 修改为主机时,总是说我输入的是无效主机名...
- 新手教程篇-阿里云账号如何注册?