UVA10838 The Pawn Chess
UVA好题没人写系列,感觉可以稍稍练习一下面向对象编程的形式(大雾)
题意很简单,在国际象棋的棋盘中有一些兵,走到对方底线即为胜利,问最优决策下谁能获胜。并输出最小步数。
首先这里的棋盘都只有\(4\times 4\),意味这状态很小。
所以我们可以联想到用类似于Luogu P4576 [CQOI2013]棋盘游戏用对抗搜索的方式求解。
如果可以获胜就找最小步数,否则要失败的那一方应该找一个能苟活最久的状态走下去。
发现这个决策其实就是取\(\min,\max\),这里显然也可以记忆化,但状态数\(3^{16}\)加上多组数据实在带不动。
这个时候我们只能掏出对抗搜索的神奇剪枝了——\(alpha-beta\)剪枝。
原理和模板可以自行百度,其实就是一种最优性剪枝。
注意合理的实现方式,否则可能会让代码又臭又长。
CODE
#include<cstdio>
#include<vector>
#define RI register int
#define pb push_back
using namespace std;
const int N=4,INF=1e9;
struct status
{char a[N+1][N+1]; //0 white turn,1 black turninline int isover(void){for (RI i=0;i<N;++i){if (a[0][i]=='P') return 0;if (a[3][i]=='p') return 1;} return -1;}inline void expand(int player,vector <status> &next){if (!player){for (RI i=1;i<4;++i) for (RI j=0;j<4;++j) if (a[i][j]=='P'){if (a[i-1][j]=='.') { status to=*this; to.a[i-1][j]='P'; to.a[i][j]='.'; next.pb(to); }if (j&&a[i-1][j-1]=='p') { status to=*this; to.a[i-1][j-1]='P'; to.a[i][j]='.'; next.pb(to); }if (j<3&&a[i-1][j+1]=='p') { status to=*this; to.a[i-1][j+1]='P'; to.a[i][j]='.'; next.pb(to); }}} else{for (RI i=0;i<3;++i) for (RI j=0;j<4;++j) if (a[i][j]=='p'){if (a[i+1][j]=='.') { status to=*this; to.a[i+1][j]='p'; to.a[i][j]='.'; next.pb(to); }if (j&&a[i+1][j-1]=='P') { status to=*this; to.a[i+1][j-1]='p'; to.a[i][j]='.'; next.pb(to); }if (j<3&&a[i+1][j+1]=='P') { status to=*this; to.a[i+1][j+1]='p'; to.a[i][j]='.'; next.pb(to); }}}}
}st; int t;
inline int AlphaBeta_Search(status now,int step,int player,int alpha,int beta)
{int res=now.isover(); if (!res) return INF-step; if (~res) return step-INF;vector <status> next; next.clear(); now.expand(player,next);int lim=next.size(); if (!lim) return player?INF-step:step-INF;for (RI i=0;i<lim;++i){res=AlphaBeta_Search(next[i],step+1,player^1,alpha,beta);if (player) beta=res<beta?res:beta; else alpha=res>alpha?res:alpha;if (beta<=alpha) break;}return player?beta:alpha;
}
int main()
{for (scanf("%d",&t);t;--t){for (RI i=0;i<4;++i) scanf("%s",st.a[i]);int res=AlphaBeta_Search(st,0,0,-2*INF,2*INF); //res<0 means black will winif (res<0) printf("black (%d)\n",res+INF); else printf("white (%d)\n",-res+INF);}return 0;
}
转载于:https://www.cnblogs.com/cjjsb/p/10300852.html
UVA10838 The Pawn Chess相关推荐
- 2018十二月刷题列表
Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...
- python国际象棋ai程序_使用Python创建属于你的国际象棋AI
使用Python创建属于你的国际象棋AI Python3 最后更新 2020-10-23 16:23 阅读 120 最后更新 2020-10-23 16:23 阅读 120 Python3 ##Fly ...
- π-Algorithmist分类题目(3)
原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(3) Probability ...
- Codeforces Round #313 (Div. 1) C. Gerald and Giant Chess DP
C. Gerald and Giant Chess Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...
- Codeforces Round #294 (Div. 2) -- A. A and B and Chess
大水,先区分大小写,分别累加,最后比较一下大小就好了. Description A and B are preparing themselves for programming contests. T ...
- hdu 1680 Cheesy Chess
hdu 1680 Cheesy Chess 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1680 题目大意:(好长的题啊- ...
- HDU 6114 Chess 【组合数】(2017百度之星程序设计大赛 - 初赛(B))
Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- [UE4]网游中角色Pawn的移动位置同步以及RTS多角色同时移动的解决方案
下面方案的思路是: 每个Actor,为其定义一个代理(ActorProxy),真实的Actor放在服务端,代理ActorProxy放在客户端,移动Actor时,实际是移动服务端上的Actor,然后对客 ...
- [unreal4入门系列之七] UE4中的Actor类和Pawn类
现在我们开始进入UE4的代码开发工作.首先,UE4的类框架是非常庞大的,看起来有点让人措手不及.不过正因为UE4的类框架很完善,有很多常用的代码(函数和类)是已经提供给我们了,我们只需要简单地调用来完 ...
最新文章
- SQL Server误区30日谈-Day21-数据损坏可以通过重启SQL Server来修复
- celery 停止任务_celery异步任务框架
- 算法基础:最大递减数问题(Golang实现)
- Android Studio项目结构介绍
- semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机
- java md5 utf-8_Jquery与java MD5加密不同
- 极度偷懒 - 实现算命程序中tabcontrol的“美化”
- php刷数据库数据库,php数据库操作种
- Sevlet处理HTML表单
- 【知识图谱系列】六篇2020年知识图谱预训练论文综述 | 30页汇报ppt免费获取 | GCC,GraphCL,DGI,InfoGraph等模型
- php显示服务器ipv6,php获取用户IPv4或IPv6地址的代码
- 页面监听-iframe子父页面信息传递与监听
- 基于Springboot+MyBatisPlus+Vue前后端分离大学生毕业论文答辩系统
- 惜时间_惜时间的作文
- cmd打开python跳转到应用商店
- 如何将镜像烧写至iNand(fastboot命令的源码分析)
- MySQL数据库——语句
- Omdia 表示,智能手机出货量下降 12.9%
- 为什么创业的人都爱跑步
- gridview ItemTemplate下绑定数据
热门文章
- sublime text 3 输入中文 linux,解决 Linux 下 Sublime Text 3 中文无法输入问题
- 动态规划经典例题:钢条切割
- LeetCode 11盛水最多的容器
- easyui-textbox 和 easyui-validatebox 设置值和获取值
- vue中的$event
- idea行号颜色修改
- Tomcat假死的原因及解决方案
- gdp笔记本 linux,Ubuntu MATE 19.04和18.04.2现在可用于GPD Pocket和GDP Pocket 2
- 【POJ3190】Stall Reservations
- NYOJ65 - 另一种阶乘问题