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

别再手动调波形了!用STM32G474的HRTIM+DAC生成精密锯齿波,附完整CubeMX配置

本文详细介绍了如何利用STM32G474的高分辨率定时器(HRTIM)和数模转换器(DAC)协同工作,实现高精度锯齿波生成。通过CubeMX配置指南、关键寄存器计算和实践技巧,帮助开发者快速掌握全硬件实现的波形生成方案,显著提升嵌入式系统的波形控制精度和响应速度。

weixin_28716769的博客 246

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

博弈基础

大田二十 2万+

FPGA中参数化SPI接口设计与Verilog实现

SPI(串行外设接口)作为嵌入式系统的核心通信协议,通过全双工、高速率特性在FPGA与Flash、ADC等外设交互中占据重要地位。参数化设计通过抽象时钟极性、数据位宽等可配置维度,采用分层架构实现硬件复用,显著提升开发效率。Verilog实现需重点处理跨时钟域同步和可配置帧结构,结合AXI总线集成与UVM验证方法学,可构建适应工业控制、物联网网关等场景的高可靠SPI解决方案。

ciya3282的博客 1408

Solidworks转URDF避坑实录:从履带机器人到ROS仿真的完整配置流程

本文详细介绍了将Solidworks履带机器人模型转换为URDF格式并配置ROS仿真的完整流程,重点解析了坐标系设置、复杂关节定义、插件配置等关键步骤中的常见问题与解决方案,帮助开发者高效实现履带机器人在RVIZ和Gazebo中的精确仿真。

weixin_30693683的博客 456

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

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

陈丹宇的博客 6340

20 Embedding 与向量检索:语义为什么能变成距离

Embedding 是 RAG 语义检索的数学基础。本文用工程视角讲清文本如何变成向量,为什么语义相近会表现为距离相近,Top-K 检索如何工作,以及在模型选择、同模型约束、精确匹配和召回评估上的常见坑。

老于的笔记的专栏 6202

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

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

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

微信小程序 - 详细解决map地图上使用自定义图标图片或自定义样式进行markers标记点,手机真机运行时安卓系统、苹果ios系统会出现不显示标记点的问题(大概率安卓正常显示标记点,但苹果就加载失败)

微信小程序,map,地图组件,安卓android,苹果ios,真机调试,marker,标记点,在地图上标记,突然就不显示白屏了没动代码,自定义标记点icon,label动态数字,小程序地图markers标记点显示不出来,微信小程序map组件,地图加载后marker标记点ios设备不显示,android正常显示,添加多个标记点。安卓能正常显示标记点图标,IOS设备不显示标记点图标,map地图白屏不显示标记,图标真机调试不显示,自定义图标,报错,页面白屏,不报错也不显示,无法加载,图片展示不出来,iconPat

✅ 精选推荐文章 5956

Python 爬虫实战:爬取评论数据做情感分析

摘要:本文介绍基于Python的京东商品评论爬取与情感分析全流程实现。通过Requests库抓取评论数据接口,结合JSON解析获取结构化评论信息。利用SnowNLP进行中文文本情感分析,量化用户评价的情感倾向(正面/负面/中性)。结果显示正面评论占比66.3%,负面评论13.3%,关键词分析发现"卡顿""发热"是主要负面因素。该方法可应用于产品优化、品牌管理等场景,为决策提供数据支持。

2503_91057718的博客 1708

Poj 1568(极大极小搜索

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

aduqw1129的博客 154

AgentScope深入分析-ReActAgent

ReActAgent 是 AgentScope 框架中最核心的智能体实现,它完美诠释了"推理-行动"(Reasoning-Acting)循环的精髓。本文将深入分析 ReActAgent 的类继承关系、核心执行流程,以及状态管理、钩子机制、实时介入等关键技术点。通过阅读本文,你会理解智能体如何与模型交互、如何执行工具、如何处理中断,以及这些机制背后的设计考量。模块化:通过组合不同的组件(模型、格式化器、工具集、记忆)来构建智能体透明性:所有关键流程都对开发者可见,可以精确控制可扩展性。

842

POJ 1568(极大极小值搜索)

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

smilestruggler_Fly To Higher 648

基于YOLOv8的应急通道占用监测系统设计与实现

通过详细的数据集选择、模型训练、代码实现等内容,本博客为您提供完整的系统搭建过程,帮助您构建高效的监测系统。然而,在一些建筑物和公共场所中,应急通道经常被不当占用,导致紧急情况下无法及时使用,严重影响人员的疏散效率。YOLOv8是YOLO系列中的最新版本,它通过引入深度学习的优化和改进,在保证检测速度的同时,显著提升了检测精度。同时,随着深度学习技术的不断发展,检测精度与速度的提升将使得该系统在更广泛的场景中应用。:如果已有监控设备,可以采集应急通道的实时视频,并进行标注,生成占用监测数据集。

YOLO 797

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

samscream的博客 1461

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

NTscan扫描工具

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

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、付费专栏及课程。

余额充值