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

用VINS-Fusion跑通EuRoC数据集:Ubuntu22.04+ROS2环境下的保姆级评测指南

本文详细介绍了在Ubuntu22.04和ROS2 Humble环境下使用VINS-Fusion处理EuRoC数据集的完整流程。从环境配置、数据集转换到参数调优和性能评估,提供了一套全面的多传感器融合分析方案,帮助开发者在无人机精准定位场景中实现高效部署与优化。

weixin_29212867的博客 517

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

博弈基础

大田二十 2万+

PYNQ-Z2 开发板从镜像烧录到 Jupyter 交互全流程指南

本文详细介绍了PYNQ-Z2开发板从镜像烧录到Jupyter交互的全流程指南,包括硬件解析、镜像烧录技巧、设备启动与网络配置、Jupyter Notebook深度使用以及实战案例分享。通过具体步骤和实用技巧,帮助开发者快速上手PYNQ-Z2开发板,实现高效的FPGA开发和智能家居控制应用。

weixin_28736355的博客 438

基因组研究之单倍型T2T基因组(一)

单倍型T2T基因组(Haplotype-resolved T2T genome)是一种高精度、高连续性、高完整性的基因组组装技术,它能够提供从端粒到端粒的完整基因组序列,包括所有的基因和非编码序列。完整覆盖:T2T基因组覆盖从端粒到端粒的染色体序列,包含所有的基因和非编码序列,包括以往难以解析的端粒和着丝粒区域。单倍型解析:单倍型T2T基因组能够区分来自父母本的遗传信息,进行亚基因组不对称演化研究,挖掘单倍型等位基因间的表达差异,这对于重测序、性状定位、进化、基因功能、基因编辑等研究至关重要。

2401_89507557的博客 2438

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

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

陈丹宇的博客 6340

设备树实践:从零构建一个嵌入式板级的设备树描述

本文详细介绍了如何从零开始为嵌入式Linux系统构建设备树(Device Tree),以i.MX6ULL处理器为例,涵盖硬件分析、设备树语法、外设配置及调试技巧。通过实践指导,帮助开发者掌握设备树编写,实现硬件与软件的高效对接,提升嵌入式开发效率。

plum99的博客 305

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

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

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

从零打造音乐会级特雷门琴:原理、设计与调试全解析

电子乐器的工作原理通常基于信号生成与调制。特雷门琴作为世界上最早的电子乐器之一,其核心原理是利用射频振荡器和电容传感,将演奏者的手势变化转化为音高与音量信号。这种技术通过外差式混频实现音高控制,并利用压控放大器实现细腻的音量动态,其工程价值在于将抽象的空间位置信息精确映射为连续的音频参数。在音乐制作、声音艺术和交互装置等领域,这类技术为创造独特的演奏体验提供了基础。本文聚焦于如何从电路层面实现一台高稳定性的特雷门琴,详细阐述了从LC振荡器设计、天线场形优化到音色混合检波等关键环节,并分享了基于LTspice

weixin_34046298的博客 170

YOLOv9 损失函数解析

YOLOv9作为YOLO系列的最新成员,在损失函数设计上进行了多项创新,重点优化了动态任务对齐机制、多模态定位损失融合以及跨层级梯度协同,进一步提升了检测精度与训练效率。

浩瀚之水的专栏 1293

Poj 1568(极大极小搜索

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

aduqw1129的博客 154

28_Spring AI 干货笔记之 OpenAI 聊天功能

本文详细介绍了在Spring AI框架中集成OpenAI聊天模型的方法。内容涵盖API密钥配置、通过starter依赖启用自动配置、连接与模型参数的详细设置,并重点说明了运行时选项的动态覆盖机制。文章还深入讲解了多模态处理(图像与音频)、结构化输出、函数调用等高级功能,提供了示例控制器和手动配置指南,并讨论了与OpenAI兼容服务器的适配与推理模型思维链的获取。

在科技的浪潮中,我们寻找着创新的火种,在代码的海洋里,我们编织着智慧的网。腾飞开源,就是这样一个由技术精英汇聚而成的博客平台,我们致力于分享在Java、Python、IoT和人工智能等领域的最新研究成果和实战经验。 在腾飞开源的博客上,你会看到紧跟技术前 1655

POJ 1568(极大极小值搜索)

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

smilestruggler_Fly To Higher 648

机器人中的数值优化(一)—— 数学优化、凸集合与凸函数

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例。

慕羽★的博客 2521

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

ssm框架搭建

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

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

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

samscream的博客 1461

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

余额充值