问题描述

大致思路:博弈论(最大最小搜索)+ DFS

A与B都以最优策略行棋,即两方都走自己胜率尽可能大的方案。对于A来说,当A行棋时,选择所有可行方案中A最大得分的那一种方案;而当B行棋时,选择的是B最大得分,即A最小得分的那一种方案。按照此规律模拟行棋的过程,dfs搜索所有可行方案,得到“最坏情况下的最好结果”,即答案。

OK~上代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;
const int N = 10, INF = 0x3f3f3f3f;
int G[N][N];bool check(int x){int ans;//同一行for(int i=0;i<3;i++){ans=0;for(int j=0;j<3;j++){if(G[i][j]==x) ans++;}if(ans==3) return true;}//同一列for(int j=0;j<3;j++){ans=0;for(int i=0;i<3;i++){if(G[i][j]==x) ans++;}if(ans==3) return true;}//同一对角线if(G[0][0]==x&&G[1][1]==x&&G[2][2]==x) return true;else if(G[0][2]==x&&G[1][1]==x&&G[2][0]==x) return true;else return false;
}int eval(){//统计当前空格数int emp=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++)if(G[i][j]==0) emp++;//判断A的得分if(check(1)) return emp+1;else if(check(2)) return -(emp+1);else if(emp==0) return 0;else return INF;
}int dfs(int u){int s = eval();//计算当前A的得分if(s!=INF) return s;//如果当前可以判断分值则直接返回分值//目前还判断不了谁输谁赢则按规则搜索情况if(u==1){//A走int ans=-INF;for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(G[i][j]==0){G[i][j]=1;ans=max(dfs(2),ans);//选下一步B可走方案中,A最大得分方案(怎么为难B怎么走)G[i][j]=0;//!!!dfs千万记得恢复现场,即枚举完当前位置需要将该位置恢复为空位}}}return ans;}else{//B走int ans=INF;for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(G[i][j]==0){G[i][j]=2;ans=min(dfs(1),ans);//选下一步A可走方案中,A最小得分方案(怎么为难A怎么走)G[i][j]=0;//!!!dfs千万记得恢复现场,即枚举完当前位置需要将该位置恢复为空位}}}return ans;}
}int main()
{int T;cin>>T;while(T--){for(int i=0;i<3;i++)for(int j=0;j<3;j++)cin>>G[i][j];int res=dfs(1);//表示A走cout<<res<<endl;}return 0;
}

一些小Tips

!!!DFS回溯时,一定要记得恢复现场

参考

Acwing

CSP认证:棋局评估相关推荐

  1. CCF CSP 201803-4 棋局评估

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

  2. CSP 201803-4 棋局评估

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

  3. [CSP]201803-4 棋局评估 min-max搜索

    题目链接http://118.190.20.162/submitlist.page?gpid=T70 井字棋,现在放了某些棋子.连成线的时候得分为(空格子数+1)(B赢*-1)问当前棋局中,如果Ali ...

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

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

  5. CCF CSP认证菜鸟刷题日志

    CCF CSP菜鸟刷题日志(c/c++) 本萌新写给自己看的,要是有大佬路过,请多多指教orz 立个flag:每日一更,至201903 9月15ccf csp,冲鸭! 今天(2019.8.18)起每天 ...

  6. CCF CSP认证考试题解目录

    由于本人的书籍<算法详解(C++11 语言描述)>已经出版,为了降低题解的维护难度,有关CCF CSP考试的所有题解的更新将全部在书籍的配套仓库进行,CSDN博客中不再进行任何题解的更新. ...

  7. CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版

    CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.Scanner;public class Mai ...

  8. CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版

    CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.ArrayList; import java.util. ...

  9. CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版

    CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版 一.题目: 二.Java70分答案 import java.util.ArrayList; import java.uti ...

  10. CSP:CSP认证考试:202109-1(数组推导)满分答案,Java版

    CSP:CSP认证考试:202109-1(数组推导)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.ArrayList; import java.util.S ...

最新文章

  1. 旷视唐文斌:你到底给谁创造了什么样的价值?AI产品灵魂拷问
  2. SpringMVC通过注解方式读取properties文件中的值
  3. 秒表项目_【速看】2021年陕西中考体育怎么考?中考体育项目及考试评分标准最全整理来了!...
  4. React之mockjs+sass+生命周期函数
  5. Oracle命令--alter 操作
  6. Dapr 已在塔架就位 将发射新一代微服务
  7. CREO 6.0 - 基础 - 01 - 零件 - 零件的装配 - 零件的移动、偏转、角度角度设定
  8. 字典的定义、字典的特性(成员操作符)
  9. 欧几里得的尺规(三等分一个线段)
  10. 线程与进程的区别及其通信方式
  11. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时6
  12. 2、使用Keras构建回归模型
  13. jxta-amalto
  14. 利用Python白玩steam游戏,我是专业的
  15. 一个稳定、快速的云服务器——萤光云
  16. Vue.js 核心精要实战解析
  17. 土壤基因组dna提取试剂盒
  18. MBRGPT硬盘分区类型属性详解(Win下更改/设置OEM/恢复分区方法)
  19. 九月比赛流水-零基础入门应用赛
  20. 1478: 多重继承派生(2)--雇员,技术人员,销售人员,经理,销售经理,开发部经理

热门文章

  1. 一花一树一城,走进三维重建的绚丽世界|专访权龙...
  2. 2020年鼠年正月十五 祝贺元宵节快乐
  3. 在表格中展示订单的倒计时定时器,用一个定时器显示多个倒计时
  4. 奇点大学人工智能专家:人造智能大脑已接近现实
  5. package有什么作用
  6. flex布局实现叠在另一个div之上_flex布局
  7. Vue-pdf实现在线预览PDF文件
  8. 零 距 离 感 悟 金 山
  9. 百度AI的语音识别与语音合成
  10. CentOS7.5搭建Heartbeat+DRBD+NFS高可用共享存储