POJ 1568 Find the Winning Move(极大极小搜索)
题目链接:http://poj.org/problem?id=1568
题意:给出一个4*4的棋盘,x和o两人轮流放。先放够连续四个的赢。给定一个局面,下一个轮到x放。问x是否有必胜策略?若有,输出能够赢的最小的坐标?
思路:(1)Maxfind(Min):每次放x,若得到的Max大于等于Min,则直接返回Max。因为Minfind要用这个Max更新Min,若x放置之后能够得到一个比Min大的,显然这样放最好;因为Min无法用Max更新;
(2)Minfind(Max)类似;
(3)因此,枚举第一个人放的位置,Minfind,返回的是INF则胜利。
char s[10][10];
int ansX,ansY,chessCnt;
int isOver(int x,int y)
{
int r[4]={0},c[4]={0},i,j;
clr(r,0); clr(c,0);
FOR0(i,4) FOR0(j,4)
{
if(s[i][j]=='x') r[i]++,c[j]++;
if(s[i][j]=='o') r[i]--,c[j]--;
}
if(abs(r[x])==4||abs(c[y])==4) return 1;
int cnt1=0,cnt2=0;
FOR0(i,4)
{
if(s[i][i]=='x') cnt1++;
if(s[i][3-i]=='x') cnt2++;
if(s[i][i]=='o') cnt1--;
if(s[i][3-i]=='o') cnt2--;
}
if(abs(cnt1)==4&&x==y||abs(cnt2)==4&&x+y==3) return 1;
return 0;
}
int Minfind(int,int,int);
int Maxfind(int x,int y,int Min)
{
int temp,Max=-INF,i,j;
if(isOver(x,y)) return Max;
if(chessCnt==16) return 0;
FOR0(i,4) FOR0(j,4) if(s[i][j]=='.')
{
s[i][j]='x';
chessCnt++;
temp=Minfind(i,j,Max);
chessCnt--;
s[i][j]='.';
if(temp>Max) Max=temp;
if(Max>=Min) return Max;
}
return Max;
}
int Minfind(int x,int y,int Max)
{
int temp,Min=INF,i,j;
if(isOver(x,y)) return Min;
if(chessCnt==16) return 0;
FOR0(i,4) FOR0(j,4) if(s[i][j]=='.')
{
s[i][j]='o';
chessCnt++;
temp=Maxfind(i,j,Min);
chessCnt--;
s[i][j]='.';
if(temp<Min) Min=temp;
if(Min<=Max) return Min;
}
return Min;
}
int check()
{
int Max=-INF,i,j,temp;
FOR0(i,4) FOR0(j,4) if(s[i][j]=='.')
{
s[i][j]='x';
chessCnt++;
temp=Minfind(i,j,Max);
chessCnt--;
s[i][j]='.';
if(temp>Max) Max=temp,ansX=i,ansY=j;
if(Max==INF) return 1;
}
return 0;
}
int main()
{
char op[5];
while(scanf("%s",op)&&op[0]!='$')
{
int i,j;
chessCnt=0;
FOR0(i,4)
{
RD(s[i]);
FOR0(j,4) chessCnt+=s[i][j]!='.';
}
if(chessCnt<=4||!check()) puts("#####");
else printf("(%d,%d)\n",ansX,ansY);
}
}
POJ 1568 Find the Winning Move(极大极小搜索)的更多相关文章
- poj 1568 Find the Winning Move 极大极小搜索
思路:用极大极小搜索解决这样的问题很方便!! 代码如下: #include <cstdio> #include <algorithm> #define inf 10000000 ...
- POJ 1568 Find the Winning Move
Find the Winning Move 链接 题意: 4*4的棋盘,给出一个初始局面,问先手有没有必胜策略? 有的话输出第一步下在哪里,如果有多个,按(0, 0), (0, 1), (0, 2), ...
- poj1568 Find the Winning Move[极大极小搜索+alpha-beta剪枝]
Find the Winning Move Time Limit: 3000MS Memory Limit: 32768K Total Submissions: 1286 Accepted: ...
- POJ 1568 极大极小搜索 + alpha-beta剪枝
极小极大搜索 的个人理解(alpha-beta剪枝) 主要算法依据就是根据极大极小搜索实现的. 苦逼的是,查了两个晚上的错,原来最终是判断函数写错了..瞬间吐血! ps. 据说加一句 if sum & ...
- 【迭代博弈+搜索+剪枝】poj-1568--Find the Winning Move
poj 1568:Find the Winning Move [迭代博弈+搜索+剪枝] 题面省略... Input The input contains one or more test cas ...
- 算法笔记--极大极小搜索及alpha-beta剪枝
参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...
- 【poj1568】 Find the Winning Move
http://poj.org/problem?id=1568 (题目链接) 题意 两人下4*4的井字棋,给出一个残局,问是否有先手必胜策略. Solution 极大极小搜索.. 这里有个强力优化,若已 ...
- 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...
- [CodeVs3196]黄金宝藏(DP/极大极小搜索)
题目大意:给出n(≤500)个数,两个人轮流取数,每次可以从数列左边或者右边取一个数,直到所有的数被取完,两个人都以最优策略取数,求最后两人所得分数. 显然这种类型的博弈题,第一眼就是极大极小搜索+记 ...
随机推荐
- JS 学习笔记--11---内置对象(Global/Math)
练习中使用的浏览器是IE10,如果各位朋友有不同意见或者遇到浏览器不兼容问题,希望指正 1.内置对象的定义:有ECMAScript实现提供的.不依赖与宿主环境的对象,在ECMAScript运行之前就已 ...
- 【bzoj1006】[HNOI2008]神奇的国度
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3114 Solved: 1401[Submit][Sta ...
- std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义
std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...
- .NET设计模式(3):抽象工厂模式(Abstract Factory)(转)
概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来 ...
- Java多线程程序设计详细解析
一.理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线 ...
- Ckeditor 中一些核心的对象的作用
1.CKEditor CKEditor对象用于掌管全局,他是一个单例对象,管理着所有实例化了的编辑框. 通过replace方法创建编辑框实例. 2.CKEditor.editor 表示一个编辑框实例, ...
- Keil RTX systick 初始化
在STM32F215上移植Keil的RTX操作系统,随便设置下就能好使,但是当我想知道systick到底是怎么设置的时候,就得翻翻代码了,原来在 rt_HAL_CM.h中以一个内联函数的形式定义的 _ ...
- DF学Mysql(三)——Mysql数据类型
Mysql数据类型分为:整数类型.浮点数类型.定点数类型日期与时间类型字符串类型二进制类型 整数类型 字节数 无符号数取值范围 有符号数取值范围TINYINT 1 0-255 -128-127SMAL ...
- sql server 存储过程,事务
1.存储过程,事务 CREATE PROCEDURE Proc_ceshi @id int, ), @returnval int output AS BEGIN SET NOCOUNT ON; Set ...
- java 反射创建对象并传入参数
/* * 通过反射创建带参数的对象 */ public Object Creatobject(String ClassPath, Object[] Params) throws Exception { ...