简单的对抗搜索

评估函数的返回值直接设定成题目中的评估得分即可

在博弈树搜索时,先手返回能向下递归所得的最大值,后手反之返回最小值

如果某种状态已经分出胜负或者平手,就说明该种状态就是博弈树中的叶子节点,需要计算评估得分进行返回

数据很小可以不用alpha-beta剪枝

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define db double
#define rep(x,a,b) for(int x=(a);x<=(b);x++)
#define per(x,a,b) for(int x=(a);x>=(b);x--)
#define reP(x,a,b) for(int x=(a);x<(b);x++)
#define Per(x,a,b) for(int x=(a);x>(b);x--)
#define scf(a) scanf("%d",&a)
#define scfll(a) scanf("%lld",&a)
#define scfdb(a) scanf("%lf",&a)
#define ptf(a) printf("%d",a)
#define ptfll(a) printf("%lld",a)
#define ptfdb(x,a) printf("%x.lf",a)
#define ptfsp(a) printf("%d ",a)
#define ptfllsp(a) printf("%lld ",a)
#define ptfdbsp(x,a) printf("%x.lf ",a)
#define pli(a,b) make_pair(a,b)
#define pb push_back
#define el puts("")
#define ls pos<<1
#define rs pos<<1|1
#define pi 3.1415926
//ios::sync_with_stdio(false);
using namespace std;
const ll mod=1e9+7;
const int maxn=2e3+5;
int a[3][3];
int check(){//计算评估分数,-2000代表还能继续进行棋局int x=0;rep(i,0,2)rep(j,0,2)x+=(a[i][j]==0);rep(i,0,2){if(a[i][0]==1&&a[i][1]==1&&a[i][2]==1) return x+1;if(a[i][0]==2&&a[i][1]==2&&a[i][2]==2) return -x-1;if(a[0][i]==1&&a[1][i]==1&&a[2][i]==1) return x+1;if(a[0][i]==2&&a[1][i]==2&&a[2][i]==2) return -x-1;}if(a[0][0]==1&&a[1][1]==1&&a[2][2]==1) return x+1;if(a[0][2]==1&&a[1][1]==1&&a[2][0]==1) return x+1;if(a[0][0]==2&&a[1][1]==2&&a[2][2]==2) return -x-1;if(a[0][2]==2&&a[1][1]==2&&a[2][0]==2) return -x-1;if(x==0) return 0;else return -2000;
}
int dfs(int dep){//dep=0代表先手,1代表后手int res=check();if(res!=-2000) return res;//叶子节点返回int Res=dep==0?-1000:1000;rep(i,0,2)rep(j,0,2){if(!a[i][j]){a[i][j]=dep==0?1:2;if(dep==0) Res=max(Res,dfs(dep^1));//先手找最大else Res=min(Res,dfs(dep^1));//后手找最小a[i][j]=0;}}return Res;
}
int main(){int T;scf(T);while(T--){rep(i,0,2)rep(j,0,2)scf(a[i][j]);ptf(dfs(0));el;}
}

加了alpha-beta剪枝的代码

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define db double
#define rep(x,a,b) for(int x=(a);x<=(b);x++)
#define per(x,a,b) for(int x=(a);x>=(b);x--)
#define reP(x,a,b) for(int x=(a);x<(b);x++)
#define Per(x,a,b) for(int x=(a);x>(b);x--)
#define scf(a) scanf("%d",&a)
#define scfll(a) scanf("%lld",&a)
#define scfdb(a) scanf("%lf",&a)
#define ptf(a) printf("%d",a)
#define ptfll(a) printf("%lld",a)
#define ptfdb(x,a) printf("%x.lf",a)
#define ptfsp(a) printf("%d ",a)
#define ptfllsp(a) printf("%lld ",a)
#define ptfdbsp(x,a) printf("%x.lf ",a)
#define pli(a,b) make_pair(a,b)
#define pb push_back
#define el puts("")
#define ls pos<<1
#define rs pos<<1|1
#define pi 3.1415926
//ios::sync_with_stdio(false);
using namespace std;
const ll mod=1e9+7;
const int maxn=2e3+5;
int a[3][3];
int check(){int x=0;rep(i,0,2)rep(j,0,2)x+=(a[i][j]==0);rep(i,0,2){if(a[i][0]==1&&a[i][1]==1&&a[i][2]==1) return x+1;if(a[i][0]==2&&a[i][1]==2&&a[i][2]==2) return -x-1;if(a[0][i]==1&&a[1][i]==1&&a[2][i]==1) return x+1;if(a[0][i]==2&&a[1][i]==2&&a[2][i]==2) return -x-1;}if(a[0][0]==1&&a[1][1]==1&&a[2][2]==1) return x+1;if(a[0][2]==1&&a[1][1]==1&&a[2][0]==1) return x+1;if(a[0][0]==2&&a[1][1]==2&&a[2][2]==2) return -x-1;if(a[0][2]==2&&a[1][1]==2&&a[2][0]==2) return -x-1;if(x==0) return 0;else return -2000;
}
int dfs(int dep,int lval){//lval表示如果父亲是先手就是父亲的alpha,否则是父亲的betaint res=check();if(res!=-2000) return res;if(dep==0){int alpha=-1e9;//alpha表示先手能找到的最大值rep(i,0,2)rep(j,0,2)if(!a[i][j]){a[i][j]=1;alpha=max(alpha,dfs(dep^1,alpha));a[i][j]=0;if(alpha>lval) return alpha;//如果先手能找到的最大值比后手父亲能找到的最小值还大,后手父亲就肯定不选当前的子树,直接返回进行剪枝}return alpha;}else{int beta=1e9;//beta表示后手能找到的最小值rep(i,0,2)rep(j,0,2)if(!a[i][j]){a[i][j]=2;beta=min(beta,dfs(dep^1,beta));a[i][j]=0;if(beta<lval) return beta;//反之同理}return beta;}
}
int main(){int T;scf(T);while(T--){rep(i,0,2)rep(j,0,2)scf(a[i][j]);ptf(dfs(0,1e9));el;}
}

貌似会写了这个跟别人下井字棋就不会输了

CSP 201803-4 棋局评估相关推荐

  1. CSP认证:棋局评估

    问题描述 大致思路:博弈论(最大最小搜索)+ DFS A与B都以最优策略行棋,即两方都走自己胜率尽可能大的方案.对于A来说,当A行棋时,选择所有可行方案中A最大得分的那一种方案:而当B行棋时,选择的是 ...

  2. CSP认证 201803-4 棋局评估(极大极小值搜索)

    题目链接:http://118.190.20.162/view.page?gpid=T70 题目大意:给一个3*3棋盘,问按照最优策略下,如果1能赢输出赢后剩余未下的格子数+1,2能赢输出赢后负的剩下 ...

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

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

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

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

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

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

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

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

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

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

  8. CCF CSP 201803-4 棋局评估

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

  9. CCF认证 2018-03 棋局评估

    状态压缩+博弈+搜索 我先把棋局按照3进制压缩为一个整数,用这个整数作为参数去搜索,比较简便 两个人都要按最优策略来,就是博弈,这道题就简单的标记下当前是哪个人走 是Alice就递归的选择接下来能得到 ...

最新文章

  1. IDEA查看Java源码
  2. EOJ_1070_下落的小球
  3. hybris backoffice 产品属性和sample data的对应关系
  4. 2018华工计算机应用基础作业,计算机应用基础平时作业2019
  5. MySQL在DOS下的基本命令操作
  6. python的with关键字
  7. mysql innodb和myisam_Mysql InnoDB和MyISAM的区别
  8. Java并发编程之CountDownLatch/CyclicBarrierDemo/SemaphoreDemo详解
  9. Javascript与未来十年的数据编程
  10. samba 和 nfs 实验
  11. javascript数据结构——栈
  12. dcp7080d怎么加墨粉_兄弟打印机DCP 7080D提示更换墨粉该怎么办-
  13. 关于74HC573使用
  14. “十一“出行防诈骗攻略来了!看完再出去浪
  15. Magento清空购物车
  16. axis2之webservice
  17. 第一个小项目——坦克大战
  18. 收藏的一些前端酷炫网站
  19. wps怎么加高亮_这些WPS表格小技巧可以在工作中省力N倍!
  20. cmd命令如何cd指定路径

热门文章

  1. HTML学习2之常用标签详细介绍
  2. layui表格自定义分页
  3. webrtc代码走读五(JitterBuffer)
  4. 51单片机 玩转按键加减切换+数码管+Proteus仿真
  5. 微服务架构技术调研<3>--微服务架构实践
  6. 基于Snort的入侵检测系统_相关论文
  7. 【项目】FT232RL设计记录
  8. FT232芯片的国产化替代
  9. 剪辑技巧,全部视频添加封面图片后保存在哪
  10. 文献管理软件 Endnote 简易上手