第十三次CCF CSP认证(2018年3月)真题棋局评估 题解

问题描述
  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行棋。
输出格式
  对于每组数据,输出一行一个整数,表示当前局面的得分。
数据规模和约定
  对于所有评测用例,1 ≤ T ≤ 5。

 

个人理解

              很直观,这个是个博弈论问题,A、B在既定棋盘状况下以最优策略使自己获胜。因为是3x3的棋盘,可以用一个9位数的数组来映射当前状态,进行记忆化搜索,因为对于某一个既定状态,它的答案是唯一的,所以搜过的状态无须再次搜索。搜索决策时注意起初当前状态无结果,搜索到一种就刷新,后续更新使最终答案正确的方法是 轮到A时在所有拓展方向中取结果最大的,B反之。两个搜索结束点是所有格子填满或一个选手赢得比赛。

   几个小点说一下,一个是判断某人是否获胜的方式,三子成一条线那么,第三个子的坐标一定是在第二个的基础上加上前两个的差值;另一个是终止状态中一定不要忘记都填满却平局的状态。

   在考场上因为观察到棋盘仅是3x3的,第一反应是打表,但在搜索决策时进入了一个很大误区,总想模拟作为一个棋手的所有决策方式,进而讲题目演化成一个巨大的模拟,耗时耗力最后发现误入歧途最终只得放弃。考后讨论后才明白记忆化搜索即为正确方法。

代码分享

#include 
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值