poj1568 极大极小搜索

极大极小搜索算法 minimax search minimax search 设计象棋等AI模型时常常需要使用博弈论的思想,minimax search就是一种基于当前状态推测出使我方最有利而对方最不利的行动,在实际模型中需要考虑状态函数,树的深度,时间成本等等因素,这里只讲一个最简单的例子说明minmax search的计算过程。 假设根据当前局面我们得到一个下图所示的博弈树: 从上往下,单数层是我方行动,双数层是对方行动,我方行动需要选择... 阅读详情
问题:给出一个4x4 tic-tac-toe 的棋局的局面,问先手 "x" 是不是能找在接下来的一步中

找到一个必胜局面,如果有,输出第一个落子位置(按顺序)。


极大极小搜索策略一般都是使用在一些博弈类的游戏之中: 
这样策略本质上使用的是深度搜索策略,所以一般可以使用递归的方法来实现。在搜索过程中,对本方有利的搜索点上应该取极大值,而对本方不利的搜索点上应该取极小值。 
极小值和极大值都是相对而言的。 
在搜索过程中需要合理的控制搜索深度,搜索的深度越深,效率越低,但是一般来说,走法越好。


#include <iostream>
using namespace std;
#define inf 100000000
int state[5][5],chess,xi,xj;
char ch;
int minfind(int,int,int);
int maxfind(int,int,int);
bool over(int x,int y) {
     bool flag = false;
     int row[5],col[5];
     memset(row,0,sizeof(row));
     memset(col,0,sizeof(col));
     for (int i=0;i<4;i++)
         for (int j=0;j<4;j++) {
             if (state[i][j]=='x') {
                row[i]++;
                col[j]++;
             }
             if (state[i][j]=='o') {
                row[i]--;
                col[j]--;
             }
         }
     if (row[x]==-4 || row[x]==4 || col[y]==-4 || col[y]==4) 
        flag = true;
     int tot1 = 0, tot2 = 0;
     for (int i=0;i<4;i++) {
         if (state[i][i]=='x') tot1++;
         if (state[i][3-i]=='x') tot2++;
         if (state[i][i]=='o') tot1--;
         if (state[i][3-i]=='o') tot2--;
     }
     if ((tot1==4 || tot1==-4) && x==y)        flag = true;
     if ((tot2==4 || tot2==-4) && x==3-y)      flag = true;
     return flag;
} 
int maxfind(int x,int y,int mini) {
    int tmp, maxi = -inf;
	if (over(x,y)) return maxi;
	if (chess==16) return 0;
	for (int i=0;i<4;i++)
	    for (int j=0;j<4;j++)
            if (state[i][j]=='.') {
                       state[i][j]='x';
                       chess++;
                       tmp = minfind(i,j,maxi);
                       chess--;
                       state[i][j]='.';
                       maxi = max(maxi, tmp);
                       if (maxi>=mini) return maxi;
            }
    return maxi;
}
int minfind(int x,int y,int maxi) {
    int tmp, mini = inf;
	if (over(x,y)) return mini;
	if (chess==16) return 0;
	for (int i=0;i<4;i++)
	    for (int j=0;j<4;j++)
            if (state[i][j]=='.') {
                       state[i][j]='o';
                       chess++;
                       tmp = maxfind(i,j,mini);
                       chess--;
                       state[i][j]='.';
                       mini = min(mini, tmp);
                       if (mini<=maxi) return mini;
            }
    return mini;
}
bool tryit() {
     int tmp, maxi = -inf;
     for (int i=0;i<4;i++)
         for (int j=0;j<4;j++)
             if (state[i][j]=='.') {
                state[i][j] = 'x';
                chess++;
                tmp = minfind(i,j,maxi);
                chess--;
                state[i][j] = '.';
                if (tmp>=maxi) {
                       maxi = tmp;
                       xi = i; xj = j;
                }
	            if (maxi==inf) return true;
             }
     return false;
}
int main() {
	while (scanf("%c",&ch)) {
		if (ch=='$') break;
		scanf("%c",&ch);

		chess = -4;
		for (int i=0;i<4;i++)
			for (int j=0;j<5;j++) {
				scanf("%c",&state[i][j]);
				chess += state[i][j]!='.';
			}
		if (chess<=4) {  //强力剪枝 
                      printf("#####\n");
                      continue;
        }
        if (tryit()) printf("(%d,%d)\n",xi,xj);
        else printf("#####\n");
	}
	return 0;
}



极大极小搜索α-β剪枝(poj 1568) 极大极小搜索:      A和B对弈,轮到A走棋了,那么我们会遍历A的每一个可能走棋方法,然后对于前面A的每一个走棋方法,遍历B的每一个走棋方法,然后接着遍历A的每一个走棋方法,如此下去,直到得到确定的结果或者达到了搜索深度的限制。当达到了搜索深度限制,此时无法判断结局如何,一般都是根据当前局面的形式,给出一个得分,计算得分的方法被称为评价函数,不同游戏的评价函数差别很大,需要很好的设计。 阅读详情

相关推荐

对抗搜索(极大极小值搜索)

http://web.cs.ucla.edu/~rosen/161/notes/alphabeta.html http://web.cs.ucla.edu/~rosen/161/notes/minimax.html 读完上边的文章之后应该就差不多了。 附上学长给的图 这两张就是伪代码和搜索的过程。 在这里记录一下我的理解:这个搜索过程是在一颗决策树上进行的,两方我们分别记为max 和...

1999 2894

极大极小搜索

极大极小搜索 刚刚正在写棋盘问题,中途出了一个BUG,暂时还没找出来,就先写这篇博客来详细阐述一下什么时极大极小搜索。 一、详述 ​ 什么是极大极小搜索?这个问题如果你遇到了,那肯定是在双人对弈的问题中。没错,在双人对弈问题里,双方的目的都是一致的,我方想尽可能地赢,尽可能地让对方输。在真实棋局中,我方往较大赢面的方向走,对方的目的就不同了,他可以朝他较大赢的方向走,也可以反过来堵我们,这样就是降低我们赢得几率(最后大不了平局嘛)。 ​ 明白了这个,接着就可以很好地解释算法了。在实际算法中,我方考虑的是

IQIUM的博客 2679

BookSim2.0 教程

本文是yz关于BookSim2.0的个人学习经验与教程。 1.介绍 什么是BookSim2.0 BookSim2.0 是周期正确的互联网络模拟器(A Cycle-Accurate Interconnection Network Simulator),被设计用来伴随William James Dally 等人出版的的书籍 Principles and Practices of INterconnection on Networks使用。 此后其功能不断得到扩展。当前的主要版本 BookSim 2.0 支持广泛

更新一些计算机体系架构NoC,GEM5, AXI4,还有machine learning 的日常 5736

博弈基础——极大极小搜索

博弈基础

大田二十 2万+

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

vue微前端qiankun框架学习到项目实战,基座登录动态菜单及权限控制

技术无关,独立开发,独立部署,增量升级,独立运行,微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用。

前端开发工程师 9747

人工智能算法模型--Minimax(极大极小)搜索算法学习笔记

本篇的主要内容: Minimax算法(极大极小算法) 学习和掌握Minimax算法的实现原理 Minimax算法的描述 Minimax算法的实例演示过程

陈丹宇的博客 6340

基于VUE的智慧园区可视化平台(开题报告+源码)

本系统(程序源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景: 随着城市化进程的加速,园区作为城市发展的重要组成部分,其管理和运营效率直接影响到城市的经济发展和居民生活质量。传统的园区管理方式已经难以满足现代城市对于高效率、智能化的需求。因此,利用先进的信息技术构建一个智慧园区可视化平台显得尤为重要。Vue.js作为一个高效的前端框架,能够帮助开发一个动态的、用户友好的智慧园区可视化平台,实现园区管理的数字化和智能化。

liu10611的博客 1179

算法设计——极大极小搜索

极大极小搜索策略一般都是使用在一些博弈类的游戏之中:这样策略本质上使用的是深度搜索策略,所以一般可以使用递归的方法来实现。在搜索过程中,对本方有利的搜索点上应该取极大值,而对本方不利的搜索点上应该取极小值。极小值和极大值都是相对而言的。在搜索过程中需要合理的控制搜索深度,搜索的深度越深,效率越低,但是一般来说,走法越好。极大极小搜索可以分开写,也可以放在一起写。主要的算法步骤如下:1、根据side确定如何初始化best值。2、如果当前深度为0,则调用局面评估函数,返回评估值。(评估函数是根据具体问题设计的)

如果这是你所爱的,要坚持,并踏实。 1万+

使用KITTI数据集测试不同算法的性能

该文章将使用同一个kitti数据集来测试不同算法的性能,目前已经测试的算法包括:LIO-SAM,FAST-LIO2,Point-LIO,Faster-LIO。

wwtx的博客 2586

深入解析DMR协议中的4-CPFSK调制技术与实现

本文深入解析了DMR协议中采用的4-CPFSK调制技术。该技术凭借其连续相位、恒包络的特性,在有限的12.5kHz信道带宽内实现了稳健的通信,有效对抗干扰并提升功放效率,是DMR数字对讲机清晰、稳定通信的核心保障。文章详细阐述了其原理、实现细节及在协议栈中的协同作用。

weixin_29306875的博客 229

Poj 1568(极大极小搜索

题目:4*4的4子棋,给出一个局面判断是否是必胜的. 思路:裸的minmax搜索,不过这题有个很重要的剪枝,当已经下了的子小于等于4时,是不可能必胜的(具体证明没有深究..这种剪枝在赛场上可以二分把...).我的写法没有这个剪枝直接就t了...(估计hash一下也能过,不想试了...) /* * @author: Cwind */ //#pragma comment(...

aduqw1129的博客 154

STM32 DMA串口重定向printf:高效调试与性能优化实战

本文详细介绍了STM32 DMA串口重定向printf的实现方法与性能优势。通过对比传统方式的CPU高占用问题,阐述了DMA技术如何实现高效数据传输,大幅降低CPU负载。文章包含完整的代码实现、缓冲区管理技巧及实战调试方案,帮助开发者优化嵌入式系统调试效率。

lake5的博客 99

POJ 1568(极大极小值搜索)

题目链接:点击打开链接题目大意:给出一个4*4棋盘,问你x先手的情况下,是否能实现必胜(胜利条件是横着或竖着或斜着出现四连)题目思路:第一道极大极小值搜索题目...首先一个强大的剪枝,如果下的步数小于等于4,那么肯定可以平局(好像是井字棋特性),然后极大极小值搜索。极大极小值搜索介绍:极大极小值搜索靠的是返回的数值,每个人下一步,到最后如果返回1就说明必胜,否则就不一定必胜。因为要判断是否必胜,所...

smilestruggler_Fly To Higher 648

【ArcGIS Engine二次开发】入门基础(2):ArcGIS开发方式(VBA、DLL、Add-in、Engine)对比

文章目录2.1 使用VBA进行桌面软件开发2.1.1 VBA开发方式2.1.1 VBA代码的安全性2.2 使用DLL进行桌面软件开发2.2.1 DLL开发方式2.2.2 DLL功能的应用部署2.3 使用Add-in进行桌面软件开发2.4 使用ArcGIS Engine构建独立应用程序 对于桌面GIS应用来说,ArcGIS平台不仅提供了用于开发独立运行的GIS应用软件的二次开发工包ArcGIS Engine,还提供了对ArcGIS Deskop桌面软件进行扩展的开发的话,在开发个具体的GIS 行业应用软件时

智慧空间实验室 6509

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Poj1568 Find the Winning Move(极大极小搜索)

<br />题目链接:http://poj.org/problem?id=1568<br /> <br />题意:给出一个4x4 tic-tac-toe 的棋局的局面,问先手 "x" 是不是能找在接下来的一步中找到一个必胜局面,如果有,按给出的顺序输出第一个落子位置。<br /> <br />博弈题,极大极小搜索刚好可以用于此,注意的是要搜索至分出胜负或和局时返回。<br /> <br />#include<stdio.h> #include<string.h> #include<time.h> #d

dooder_daodao的专栏 1442

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

POJ -1568 Alpha-Beta剪枝&极大极小搜索

极大极小搜索策略一般都是使用在一些博弈类的游戏之中: 理论上可以穷举所有的走法,这就需要生成整棵博弈树。这样就会使得时间复杂度非常的大。怎么解决这个问题呢? 因此搜索时可以限定博弈树的深度,相当于只往前看n步,来减少时间复杂度。 这样策略本质上使用的是深度搜索策略,在搜索过程中,对本方有利的搜索点上应该取极大值,而对本方不利的搜索点上应该取极小值,实现上就可以通过极大搜索函数和极小搜索 函数,...

samscream的博客 1461

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

poj 1568 Find the Winning Move 极大极小搜索

思路:用极大极小搜索解决这样的问题很方便!! 代码如下: 1 #include <cstdio> 2 #include <algorithm> 3 #define inf 100000000 4 using namespace std; 5 char str[4][5]; 6 int x,y,num; 7 bool ...

weixin_30877227的博客 117

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大的...

weixin_33845477的博客 146

POJ 1568 极大极小搜索 + alpha-beta剪枝

极小极大搜索 的个人理解(alpha-beta剪枝) 主要算法依据就是根据极大极小搜索实现的。 苦逼的是,查了两个晚上的错,原来最终是判断函数写错了。。瞬间吐血! ps. 据说加一句 if sum < 4 printf("#####\n")会变态的快,不过懒得加了 ps. 1表示胜利,0表示平局,-1表示失败。 #include <cstdio> #inclu...

weixin_33974433的博客 192

poj 1085 Triangle War 1568 Find the Winning Move 极大极小搜索 alpha-beta剪枝

一,极大极小搜索及alpha-beta剪枝

gwq5210的专栏 1323

【POJ1568】【极大极小搜索+alpha-beta剪枝】Find the Winning Move

Description 4x4 tic-tac-toe is played on a board with four rows (numbered 0 to 3 from top to bottom) and four columns (numbered 0 to 3 from left to right). There are two players, x and o, who mo...

Gregory99174的博客 312

POJ 1568 Find the Winning Move 极大极小搜索+alpha-beta剪枝 -

题解看注释 #include #include #include #include #include #include #include using namespace std; const int INF=1<<30; char str[5][5]; int X,Y,chess; bool check(int x,int y){ bool ok=true; for(int i=1;i

BRCOCOLI的博客 595

poj1568 Find the Winning Move----Find the Winning Move极大极小搜索

Find the Winning Move Time Limit: 3000MS   Memory Limit: 32768K Total Submissions: 421   Accepted: 240 Description 4x4 tic-tac-toe is played on a board with four rows (numb

Shirley 2861
上一篇: poj 4020 逆序对
下一篇: poj2362 dfs
琴空
博客等级 码龄16年 48粉丝 82原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值