博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【poj1568】 Find the Winning Move
阅读量:5227 次
发布时间:2019-06-14

本文共 2290 字,大约阅读时间需要 7 分钟。

 (题目链接)

题意

  两人下4*4的井字棋,给出一个残局,问是否有先手必胜策略。

Solution

  极大极小搜索。。

  这里有个强力优化,若已经被下了的的格子数cnt小于等于4的话,那么一定是平局至于为什么,自己YY一下发现好像是这样的。。

代码

// poj1568#include
#include
#include
#include
#include
#include
#include
#define MOD 100003#define inf 2147483640#define LL long long#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);using namespace std;char s[4][4];int a[4][4],cnt;int check(int f,int &X,int &Y) { for (int i=0;i<4;i++) { int ff=0; for (int j=0;j<4;j++) if (a[i][j]==f) ff++; //if (ff==3) for (int j=0;j<4;j++) if (!a[i][j]) {X=i,Y=j;return 1;} if (ff==4) return 1; } for (int j=0;j<4;j++) { int ff=0; for (int i=0;i<4;i++) if (a[i][j]==f) ff++; //if (ff==3) for (int i=0;i<4;i++) if (!a[i][j]) {X=i,Y=j;return 1;} if (ff==4) return 1; } int ff=0; for (int i=0;i<4;i++) if (a[i][i]==f) ff++; //if (ff==3) for (int i=0;i<4;i++) if (!a[i][i]) {X=i,Y=i;return 1;} if (ff==4) return 1; ff=0; for (int i=0;i<4;i++) if (a[i][4-i-1]==f) ff++; //if (ff==3) for (int i=0;i<4;i++) if (!a[i][4-i-1]) {X=i,Y=4-i-1;return 1;} if (ff==4) return 1; return 0;}int maxdfs(int beta,int &X,int &Y);int mindfs(int alpha,int &X,int &Y) { if (cnt==16) return 0; int x,y,tmp=inf; int f=check(1,X,Y); if (f==1) return inf; for (int i=0;i<4;i++) for (int j=0;j<4;j++) if (!a[i][j]) { X=i,Y=j;a[i][j]=2;cnt++; tmp=min(tmp,maxdfs(tmp,x,y)); a[i][j]=0;cnt--; if (tmp<=alpha) return tmp; } return tmp;}int maxdfs(int beta,int &X,int &Y) { if (cnt==16) return 0; int x,y,tmp=-inf; int f=check(2,X,Y); if (f==1) return -inf; for (int i=0;i<4;i++) for (int j=0;j<4;j++) if (!a[i][j]) { X=i,Y=j;a[i][j]=1;cnt++; tmp=max(tmp,mindfs(tmp,x,y)); a[i][j]=0;cnt--; if (tmp>=beta) return tmp; } return tmp;}int main() { while (scanf("%s",s[0]) && s[0][0]!='$') { cnt=0; for (int i=0;i<4;i++) scanf("%s",s[i]); for (int i=0;i<4;i++) for (int j=0;j<4;j++) { if (s[i][j]=='.') a[i][j]=0; else if (s[i][j]=='x') a[i][j]=1; else if (s[i][j]=='o') a[i][j]=2; if (s[i][j]!='.') cnt++; } if (cnt<=4) {printf("#####\n");continue;} //蜜汁优化 int X,Y; int res=maxdfs(inf,X,Y); if (res==inf) printf("(%d,%d)\n",X,Y); else printf("#####\n"); } return 0;}

  

转载于:https://www.cnblogs.com/MashiroSky/p/5926489.html

你可能感兴趣的文章
Loadrunner socket协议lrs_receive函数接收到返回数据包 仍然等待服务器返回--解决
查看>>
C++第二周学习小结
查看>>
java读书笔记
查看>>
md5sum命令详解
查看>>
[bzoj1004] [HNOI2008] Cards
查看>>
使用 Swoole 来加速你的 Laravel 应用
查看>>
TextWatcher原因activity内存泄漏问题
查看>>
Merge into的使用具体解释-你Merge了没有
查看>>
Linux安装程序Anaconda分析
查看>>
如何在chrome上打开SSL3.0
查看>>
应该是实例化对象的没有对属性赋值时,自动赋值为null,但不是空指针对象引用...
查看>>
从网易与淘宝的font-size思考前端设计稿与工作流
查看>>
Struts2 拦截器过滤方法
查看>>
输出进度条
查看>>
js 原型链
查看>>
linux常用命令:sort 命令
查看>>
单元测试Junit4
查看>>
祝贺博文《软件开发高手须掌握的4大SQL精髓语句(综合篇)》三天内获得3500多次浏览...
查看>>
SQL Server 内存不足引起的并发症
查看>>
【nodejs代理服务器三】nodejs注册windows服务
查看>>