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相关推荐

  1. 2018十二月刷题列表

    Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...

  2. python国际象棋ai程序_使用Python创建属于你的国际象棋AI

    使用Python创建属于你的国际象棋AI Python3 最后更新 2020-10-23 16:23 阅读 120 最后更新 2020-10-23 16:23 阅读 120 Python3 ##Fly ...

  3. π-Algorithmist分类题目(3)

    原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(3) Probability ...

  4. 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 ...

  5. Codeforces Round #294 (Div. 2) -- A. A and B and Chess

    大水,先区分大小写,分别累加,最后比较一下大小就好了. Description A and B are preparing themselves for programming contests. T ...

  6. hdu 1680 Cheesy Chess

    hdu   1680   Cheesy Chess           题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1680 题目大意:(好长的题啊- ...

  7. HDU 6114 Chess 【组合数】(2017百度之星程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. [UE4]网游中角色Pawn的移动位置同步以及RTS多角色同时移动的解决方案

    下面方案的思路是: 每个Actor,为其定义一个代理(ActorProxy),真实的Actor放在服务端,代理ActorProxy放在客户端,移动Actor时,实际是移动服务端上的Actor,然后对客 ...

  9. [unreal4入门系列之七] UE4中的Actor类和Pawn类

    现在我们开始进入UE4的代码开发工作.首先,UE4的类框架是非常庞大的,看起来有点让人措手不及.不过正因为UE4的类框架很完善,有很多常用的代码(函数和类)是已经提供给我们了,我们只需要简单地调用来完 ...

最新文章

  1. SQL Server误区30日谈-Day21-数据损坏可以通过重启SQL Server来修复
  2. celery 停止任务_celery异步任务框架
  3. 算法基础:最大递减数问题(Golang实现)
  4. Android Studio项目结构介绍
  5. semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机
  6. java md5 utf-8_Jquery与java MD5加密不同
  7. 极度偷懒 - 实现算命程序中tabcontrol的“美化”
  8. php刷数据库数据库,php数据库操作种
  9. Sevlet处理HTML表单
  10. 【知识图谱系列】六篇2020年知识图谱预训练论文综述 | 30页汇报ppt免费获取 | GCC,GraphCL,DGI,InfoGraph等模型
  11. php显示服务器ipv6,php获取用户IPv4或IPv6地址的代码
  12. 页面监听-iframe子父页面信息传递与监听
  13. 基于Springboot+MyBatisPlus+Vue前后端分离大学生毕业论文答辩系统
  14. 惜时间_惜时间的作文
  15. cmd打开python跳转到应用商店
  16. 如何将镜像烧写至iNand(fastboot命令的源码分析)
  17. MySQL数据库——语句
  18. Omdia 表示,智能手机出货量下降 12.9%
  19. 为什么创业的人都爱跑步
  20. gridview ItemTemplate下绑定数据

热门文章

  1. sublime text 3 输入中文 linux,解决 Linux 下 Sublime Text 3 中文无法输入问题
  2. 动态规划经典例题:钢条切割
  3. LeetCode 11盛水最多的容器
  4. easyui-textbox 和 easyui-validatebox 设置值和获取值
  5. vue中的$event
  6. idea行号颜色修改
  7. Tomcat假死的原因及解决方案
  8. gdp笔记本 linux,Ubuntu MATE 19.04和18.04.2现在可用于GPD Pocket和GDP Pocket 2
  9. 【POJ3190】Stall Reservations
  10. NYOJ65 - 另一种阶乘问题