POJ 1568 极大极小搜索 + alpha-beta剪枝
极小极大搜索 的个人理解(alpha-beta剪枝)
主要算法依据就是根据极大极小搜索实现的。
苦逼的是,查了两个晚上的错,原来最终是判断函数写错了。。瞬间吐血!
ps. 据说加一句 if sum < 4 printf("#####\n")会变态的快,不过懒得加了
ps. 1表示胜利,0表示平局,-1表示失败。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <utility>
#include <vector>
#include <queue>
#include <set>
#define INF 0x3f3f3f3f using namespace std; int map[4][4], sum, winx, winy;
char c; bool check(int otherplayer)
{
for(int i = 0; i < 4; i ++)
{
int tmp = 0;
for(int j = 0; j < 4; j ++)
tmp += (map[i][j] == otherplayer);
if(tmp == 4)
return 1;
}
for(int j = 0; j < 4; j ++)
{
int tmp = 0;
for(int i = 0; i < 4; i ++)
tmp += (map[i][j] == otherplayer);
if(tmp == 4)
return 1;
}
int tmp1 = 0, tmp2 = 0;
for(int i = 0; i < 4; i ++)
{
tmp1 += (map[i][i] == otherplayer);
tmp2 += (map[3-i][i] == otherplayer);
}
if(tmp1 == 4 || tmp2 == 4)
return 1;
return 0;
} int alpha_beta(int depth, int alpha, int beta)
{
int nowplayer = depth&1;
if(check(1-nowplayer))
return -1;
if(sum == 16)
return 0;
for(int i = 0; i < 4; i ++)
for(int j = 0; j < 4; j ++)
if(map[i][j] == 2)
{
map[i][j] = nowplayer;
sum ++;
int tmp = -alpha_beta(depth+1, -beta, -alpha);
map[i][j] = 2;
sum --;
if(tmp >= beta)
return beta;
if(tmp > alpha)
alpha = tmp;
if(depth == 0 && alpha == 1)
{
winx = i, winy = j;
return alpha;
}
}
return alpha;
} int main()
{
while(getchar() != '$')
{
sum = 0;
getchar();
for(int i = 0; i < 4; i ++)
for(int j = 0; j < 4; j ++)
{
c = getchar();
switch (c){
case '.':
map[i][j] = 2;
break;
case 'x':
map[i][j] = 0;
sum ++;
break;
case 'o':
map[i][j] = 1;
sum ++;
}
if(j == 3) getchar();
}
if(alpha_beta(0, -INF, INF) == 1)
printf("(%d,%d)\n", winx, winy);
else
printf("#####\n");
}
return 0;
} /* ?
....
.xo.
.ox.
....
?
o...
.ox.
.xxx
xooo
?
xxxo
oxox
....
xxxo
$ */
POJ 1568 极大极小搜索 + alpha-beta剪枝的更多相关文章
- 算法笔记--极大极小搜索及alpha-beta剪枝
参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...
- 新手立体四子棋AI教程(3)——极值搜索与Alpha-Beta剪枝
上一篇我们讲了评估函数,这一篇我们来讲讲立体四子棋的搜索函数. 一.极值搜索 极值搜索是game playing领域里非常经典的算法,它使用深度优先搜索(因为限制最大层数,所以也可以称为迭代加深搜索) ...
- poj 1568 Find the Winning Move 极大极小搜索
思路:用极大极小搜索解决这样的问题很方便!! 代码如下: #include <cstdio> #include <algorithm> #define inf 10000000 ...
- 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...
- POJ 1568 Find the Winning Move
Find the Winning Move 链接 题意: 4*4的棋盘,给出一个初始局面,问先手有没有必胜策略? 有的话输出第一步下在哪里,如果有多个,按(0, 0), (0, 1), (0, 2), ...
- 博弈论经典算法(一)——对抗搜索与Alpha-Beta剪枝
前言 在一些复杂的博弈论题目中,每一轮操作都可能有许多决策,于是就会形成一棵庞大的博弈树. 而有一些博弈论题没有什么规律,针对这样的问题,我们就需要用一些十分玄学的算法. 例如对抗搜索. 对抗搜索简介 ...
- 软件发布版本区别介绍-Alpha,Beta,RC,Release
Alpha: Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用. 是希腊字母的第一位,表示最初级的版本 alpha就是α,beta就是β alpha版就是比 ...
- 软工+C(2017第4期) Alpha/Beta换人
// 上一篇:超链接 // 下一篇:工具和结构化 注:在一次软件工程讨论课程进度设计的过程中,出现了这个关于 Alpha/Beta换人机制的讨论,这个机制在不同学校有不同的实施,本篇积累各方观点,持续 ...
- 软工+C(4): Alpha/Beta换人
// 上一篇:超链接 // 下一篇:工具和结构化 注:在一次软件工程讨论课程进度设计的过程中,出现了这个关于 Alpha/Beta换人机制的讨论,这个机制在不同学校有不同的实施,本篇积累各方观点,持续 ...
随机推荐
- select 自动选择 检查下拉列表
下面我们来看一下selenium webdriver是如何来处理select下拉框的,以Apple注册页面为例. https://appleid.apple.com/cgi-bin/WebObject ...
- python的最大递归层数
def foo(n): print(n) n += 1 foo(n) if __name__ == '__main__': foo(1) 打印出998,然后报错 RecursionError: max ...
- 实参相依查找[条款25]----《C++必知必会》
名字空间对现代C++编程和设计有着深远的影响.其中有些影响直接而明显,例如using声明和using 指令以及采用名字空间作用域加以限定的名字.然而,名字空间还有一些在语法上不那么明显但任然很有基础. ...
- 使用LocationManager来获取移动设备所在的地理位置信息
在Android应用程序中,可以使用LocationManager来获取移动设备所在的地理位置信息.看如下实例:新建android应用程序TestLocation. 1.activity_main.x ...
- XDU 1022 (数论筛法+前缀和)
解法一:数论筛法+前缀和 //其实题目中f[n]的值可理解为存在多少个整数对使a*b<=n #include<cstdio> #define N 1007 #define maxn ...
- IOS开发如何入门
说到 iOS 开发,自己学得也很浅.不过至少独立一人完成了一个应用的开发到项目上线整个过程.分享一下自己的建议和想法. 首先建议阅读 Start Developing iOS Apps Today,你 ...
- 获取Json字符串中某个key对应的value
JSONObject jsonObj= JSONObject.fromObject(jsonStr); String value= jsonObj.getString(key);
- Linux 系统日志管理
Linux rsyslogd服务及启动方法 在 CentOS 6.x 中,日志服务已经由 rsyslogd 取代了原先的 syslogd.Red Hat 公司认为 syslogd 已经不能满足工作中的 ...
- NUMA架构的优缺点
numa把一台计算机分成多个节点(node),每个节点内部拥有多个CPU,节点内部使用共有的内存控制器,节点之间是通过互联模块进行连接和信息交互.因此节点的所有内存对于本节点所有的CPU都是等同的,对 ...
- 利用python获取nginx服务的ip以及流量统计信息
#!/usr/bin/python #coding=utf8 log_file = "/usr/local/nginx/logs/access.log" with open(log ...