POJ 1085 Triangle War

博弈(alpha-beta 剪枝)POJ —— 1085 Triangle War 阅读详情

Triangle War
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 1465 Accepted: 582

Description

Triangle War is a two-player game played on the following triangular grid: 

Two players, A and B, take turns filling in any dotted line connecting two dots, with A starting first. Once a line is filled, it cannot be filled again. If the line filled by a player completes one or more triangles, she owns the completed triangles and she is awarded another turn (i.e. the opponent skips a turn). The game ends after all dotted lines are filled in, and the player with the most triangles wins the game. The difference in the number of triangles owned by the two players is not important. 

For example, if A fills in the line between 2 and 5 in the partial game on the left below: 

Then, she owns the triangle labelled A and takes another turn to fill in the line between 3 and 5. B can now own 3 triangles (if he wishes) by filling in the line between 2 and 3, then the one between 5 and 6, and finally the one between 6 and 9. B would then make one more move before it is A's turn again. 
In this problem, you are given a number of moves that have already been made. From the partial game, you should determine which player will win assuming that each player plays a perfect game from that point on. That is, assume that each player always chooses the play that leads to the best possible outcome for himself/herself.

Input

You will be given a number of games in the input. The first line of input is a positive integer indicating the number of games to follow. Each game starts with an integer 6 <= m <= 18 indicating the number of moves that have been made in the game. The next m lines indicate the moves made by the two players in order, each of the form i j (with i < j) indicating that the line between i and j is filled in that move. You may assume that all given moves are legal.

Output

For each game, print the game number and the result on one line as shown below. If A wins, print the sentence "A wins." If B wins, print "B wins."

Sample Input

4 
6 
2 4 
4 5 
5 9 
3 6 
2 5 
3 5 
7 
2 4 
4 5 
5 9 
3 6 
2 5 
3 5 
7 8 
6 
1 2 
2 3 
1 3 
2 4 
2 5 
4 5 
10 
1 2 
2 5 
3 6 
5 8 
4 7 
6 10 
2 4 
4 5 
4 8 
7 8 

Sample Output

Game 1: B wins. 
Game 2: A wins. 
Game 3: A wins. 
Game 4: B wins.

Source

dp (博弈)

#include <iostream>
//一共有18条线
#define MAX_LINE 18
//一共有九个三角形
#define MAX_T 9
//状态的最大值是OX3FFFF,所以一共有0X40000个状态
#define MAX_SN 0X40000
using namespace std;

//每条线所在位值的标记
int exp[MAX_LINE + 1] = {0, 0X1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000};
//每个三角形的标记,有三角形的三条边的位置决定
int tri[MAX_T + 1][3] =
{
    {0, 0, 0},
    {exp[1],  exp[2],  exp[3]},
    {exp[4],  exp[5],  exp[8]},
    {exp[3],  exp[5],  exp[6]},
    {exp[6],  exp[7],  exp[9]},
    {exp[10], exp[11], exp[16]},
    {exp[8],  exp[11], exp[12]},
    {exp[12], exp[13], exp[17]},
    {exp[9],  exp[13], exp[14]},
    {exp[14], exp[15], exp[18]}
};
//每条线的标记,有两个顶点的标号决定
int linePID[MAX_LINE + 1][2] =
{
    {0, 0}, {1, 2}, {1, 3}, {2, 3}, {2, 4}, {2, 5}, {3, 5},
            {3, 6}, {4, 5}, {5, 6}, {4, 7}, {4, 8}, {5, 8},
            {5, 9}, {6, 9}, {6, 10}, {7, 8}, {8, 9}, {9, 10}
};
//f是DP的备忘录,用来标记当前状态下,A先走,且AB都按最优走法走条件下,AB取得的三角形个数差值的最大值
int f[MAX_SN + 5], caseN, stepN;

//state状态下,走lineExp这条线新形成的三角形的个数
int takeStep(int state, int lineExp)
{
    int i, j, count, triID, num = 0;
    //遍历所有的三角形
    for(i = 1; i <= MAX_T; i++)
    {
        //count记录在当前三角形中,已经走过的边的个数
        count = 0, triID = -1;
        for(j = 0; j < 3; j++)
        {
            //记录用来表示找到这个边所属的三角形
            if(tri[i][j] == lineExp)
                triID = j;
            else if(state & tri[i][j])
                count++;
        }
        if(triID == -1)
            continue;
        if(count == 2)
            num++;
    }
    return num;
}

//DP规划解当前状态下,某一方先走,双发都采用最优策略时,双方能达到的最大三角形差值
//这里先走的一方不一定,可以是A,也可以是B
int dpSolve(int curState)
{
    //已经计算过了
    if(f[curState] != INT_MIN)
        return f[curState];

    //maxVal:所能达到的最大差值
    int maxVal = INT_MIN, i, curVal, extra;
    //遍历所有的边
    for(i = 1; i <= MAX_LINE; i++)
    {
        curVal = 0;

        //找到一条尚未走的边
        if(!(curState & exp[i]))
        {
            //走这条边可以带来的新的三角形个数
            extra = takeStep(curState, exp[i]);
            //取得三角形,当前player继续行进
            if(extra > 0)
                curVal = extra + dpSolve(curState | exp[i]);
            else //否则换下一个player
                curVal = extra - dpSolve(curState | exp[i]);
            //update最大值
            if(curVal > maxVal)
            maxVal = curVal;
        }
    }
    //记录状态
    f[curState] = maxVal;
    return maxVal;
}
int main()
{
    int cn, i, j, from, to, curVal, curState, totalVal, which;
    for(i = 0; i <= MAX_SN; i++)
        f[i] = INT_MIN;
    //初始状态,当所有线都走掉时,双方都不能走,所以最大差值为0
    f[0X3ffff] = 0;
    cin>>caseN;
    for(cn = 1; cn <= caseN; cn++)
    {
        totalVal = 0, curState = 0, which = 1; //A先走
        cin>>stepN;
        for(i = 1; i <= stepN; i++)
        {
            curVal = 0;
            cin>>from>>to;
            //遍历所有线找到当前线的标号
            for(j = 1; j <= MAX_LINE; j++)
            {
                if(linePID[j][0] == from && linePID[j][1] == to)
                {
                    //计算走这条线可以带来的差值
                    curVal = takeStep(curState, exp[j]);
                    //状态更新
                    curState |= exp[j];
                    break;
                }
            }
            //有新三角形被发现,增加差值
            if(curVal > 0)
                totalVal += which * curVal;
            //没有三角形被发现,换另外一个player走
            else
                which *= -1;
        }
        //结果输出
        char who;
        int resP = totalVal + which * dpSolve(curState);
        who = (resP > 0) ? 'A' : 'B';
        cout<<"Game "<<cn<<":"<<" "<<who<<" wins."<<endl;
    }
    return 0;
}

博弈搜索练习-极大极小值搜索+AlphaBeta剪枝--POJ 1085-Triangle War/三角点格棋 Triangle War Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3066   Accepted: 1207 Description Triangle War is a two-player game played on the following tr 阅读详情

相关推荐

Flash芯片的VCC上电到可操作时间过长

Flash的VCC上电到操作时间(tVSL)通常有最大值限制,如果超过这个时间,核心风险是状态机不同步和指令锁存错误。比如芯片内部振荡器可能已经尝试启动又休眠了,但主控却在这之后才发送指令,导致完全 misinterpreted。Flash芯片的(从电源上电到可以正常进行读写操作的时间)如果过长,会产生一系列负面影响简单来说,这个时间过长意味着电源上升速度太慢,违反了芯片的要求。

qq_61918649的博客 722

1085:Triangle War

1085:Triangle War 已翻译, 有AC代码

guagua290290的博客 973

高频面波成像实战:从频散曲线到全波形反演

面波勘探是近地表工程勘察的重要手段,其核心原理在于不同频率的面波对地下介质的敏感深度不同,由此形成的频散曲线能够反映浅层剪切波速结构。相较于传统钻探与折射波法,高频面波成像具有无损、高效、对低速夹层敏感等优势,广泛应用于路基检测、空洞探测、滑坡调查等领域。在实际工程中,从野外采集的排列设计、震源选型,到频散谱提取与频散曲线反演,每一步都直接影响成像精度。然而频散反演受限于一维层状假设,难以刻画横向剧烈变化的地质体。全波形反演通过拟合完整波形信息,能够突破频散曲线的分辨率边界,获得更精细的近地表速度模型。本文

weixin_29090917的博客 270

zoj1155 triangle war

/**DP 对状态编号, 18条边, 每条边可能实线, 也可能虚线, 有2^18种MaxScore(x) = max {               StepScore(rCode, selectedEdgeNum) > 0            ?  StepScore + MaxScore(rCode)         //选择的边成三角行           

yllfever的专栏 1011

vscode使用continue插件连接LM studio的模型

本文详细介绍了如何使用VSCode的Continue插件连接LM Studio模型。主要步骤包括:在LM Studio中加载模型并设置相关参数,启动API服务,修改Continue配置文件以集成LM Studio模型,并进行测试以验证连接是否成功。通过这些步骤,用户可以将LM Studio中的预训练模型与VSCode的Continue插件无缝对接,实现高效的自然语言处理和编程辅助功能。

weixin_43590837的博客 8628

使用下一代的嵌入式IDE-PlatformIO 教程

1.生成工程 1.1 打开STM32CubeMX: 选择你的MCU,这里我用的是STM32F103RC RCC中开启外部HSE时钟,外部时钟比HSI更稳定些 开启DEBUG 4线 打开串口1用于打印调试信息,波特率115200,校验位0,停止位1 打开串口2用于MODBUS协议,波特率9600,校验位0,停止位1 接入RT-thread:参考官方文档 基于 CubeMX 移植 RT-Thread Nano 根据官方文档,需要1.取消生成HardFault_Handler、PendSV_Handler、Sy

jiladahe1997的博客 3万+

Poj 1085 Triangle War (极大极小搜索)

题目链接:http://poj.org/problem?id=1085   题意:两个人轮流在九个小正三角形组成的大三角形上面选取边,如果当前选择的边刚好为某些三角形最后一个未选取的边,则该玩家得分为这些三解形数目,如果当前玩家取 得三角形,则可以得到另一个机会选择。

dooder_daodao的专栏 3491

AI时代敏捷开发新范式——意图驱动开发IDD

具体的功能代码、单元测试、集成测试用例,以及最终可运行的、支持PlantUML的Markdown转Word工具新版本。:业务方(如技术文档团队)反馈,现有的Markdown转Word工具在处理包含PlantUML代码块的文档时,无法正确生成图表,导致技术方案、架构图等关键信息丢失,严重影响了文档交付质量和团队效率。这不仅带来了交付周期显著缩短、资源效能倍增的可观收益,更深远的意义在于,它描绘了未来软件工业化、智能化的新图景:一个由精准意图驱动、AI自主执行、人类智慧引领的敏捷、高效、高质的新世界。

LiuJunjiang的专栏 550

POJ1085

题意:         游戏有A、B两人参与。A先走,每人每次任选一条虚线填成实线。而如果某人填完一条线段后,该线段与另外两条相邻的实线组成了一个单位三角形,该三角形被标记为该游戏者所有,且该游戏者必须接着再填一条虚线。当18条线段被填充完毕后,拥有三角形多的玩家获胜。         首先输入一个数 T ,表示试验次数;接着一个数 n,表示当前局面已经走了 n 条边;接着输入 n 对数,每对

a128251857的博客 461

Linux下Catapro酶动力学预测工具保姆级安装指南(PyTorch+CUDA11.8适配版)

本文提供了Linux系统下Catapro酶动力学预测工具的详细安装指南,特别适配PyTorch+CUDA11.8环境。从环境准备、源码获取到虚拟环境创建、依赖包安装和模型配置,逐步指导用户完成安装流程,并包含常见问题排查和性能优化建议,帮助研究者快速部署这一高效酶动力学参数预测工具。

weixin_29278805的博客 211

[解决] PDF转图片,中文乱码或显示方框的解决方案

在Java开发中,将PDF文件转换为图片是一项常见的需求,但过程中可能会遇到中文乱码或显示方框的问题。本文将深入探讨这一问题,并提供详细的解决方案,帮助开发者顺利地完成PDF到图片的转换。

DazedMen的博客 1924

POJ 1085 Triangle War 博弈 (对抗搜索 alpha-beta 剪枝)

Triangle WarDescription Triangle War is a two-player game played on the following triangular grid: Two players, A and B, take turns filling in any dotted line connecting two dots, with A starting fi

w4149 669

北京大学MuMo多模态肿瘤分类模型复现与迁移学习

本项目复现了北京大学MuMo多模态肿瘤分类模型,并针对特定医学影像数据集进行迁移学习。MuMo模型通过整合CT、MRI、PET等多模态医学影像数据,显著提升了肿瘤分类准确性。项目内容包括环境配置(Python 3.8+、PyTorch 1.9+)、数据预处理(DICOM/NIfTI格式处理、强度归一化)、多模态数据集类实现,以及训练验证测试集划分。关键特点是采用MONAI医学影像处理库,实现三维医学影像的标准化预处理流程,并支持多种模态数据的并行加载与联合训练,为后续模型复现和迁移学习奠定基础。

max500600的博客 1241

POJ 1085 Triangle War(博弈,極大極小搜索+alpha_beta剪枝)

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove 題目:給出10個點,總共有18條邊,每次兩個人輪流加入一條邊,如果形成一個三角形,則三角形歸他所有,而且可以額外再走一步。最後三角形多的人勝 http://poj.org/problem?id=1085 博弈問題 所謂

窝不是爱酱,喵~~~~ 4511

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

poj1085 Triangle War

Triangle War Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2509   Accepted: 984 Description Triangle War is a two-player game played on the following triangu

习惯与规则决定命运 1422

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【poj1085】 Triangle War

http://poj.org/problem?id=1085(题目链接) 题意   A,B两人玩游戏,在一个大三角形上放火柴,若A放上一根火柴后成功组成一个三角形,那么这个三角形就归属于A,并且A被奖励再放一根火柴。最后谁三角形多谁就胜。   给出一个残局,判断是否存在先手必胜策略。 Solution   最近一直在颓,好久没刷题了。。。   这就是神乎其技的极大极小搜索,其实也差不...

weixin_30808575的博客 102

廖雪峰Python教程[完整版]

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

poj 1085 Triangle War

人生第一道真正意义上的极大极小过程+alphabeta剪枝。 其实一开始让我写alphabeta剪枝我是拒绝的,于是我写了个记忆化搜索,TLE了。。。。。。。 哦然后优化了一下,300多MS A了 但是不爽啊 说好的博弈论呢 当然要用正解了 于是学了下alphabeta剪枝,其实挺简单的,就是alpha为已知max游戏者的下界,beta为min游戏者的上界,如果beta 假设在博弈树

月下沙茶树 793

POJ 1085 Triangle War 笔记

三角形游戏,两个人完游戏,A先走。如图,填单位虚线,形成一个单位三角形得一分可以再填一条虚线。给出走过的步数,求双方尽力的情况下谁会赢。

woniupengpeng的专栏 615

【DP】 POJ 1085 Triangle War

状态用二进制压缩存储,然后记忆化搜索就可以了。。。 #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 300005 #define maxm 40

yysys 507

Triangle War(POJ 1085)

<br />问题描述:<br />Triangle War is a two-player game played on the following triangular grid: <br /> <br />Two players, A and B, take turns filling in any dotted line connecting two dots, with A starting first. Once a line is filled, it cannot be filled agai

Augmented Reality & Computer Graphics 1628

poj 1085 Triangle War 极大极小搜索

Description给定一个三角形矩阵如下 两个人每次每人可以把一条虚线涂黑,若操作后的一条边与另外两条邻边形成一个三角形就能再操作一次,每次操作的得分为此次操作形成的新的三角形。现在给定一些已经走了的操作求谁会赢,假设两人绝对聪明Solution裸的极大极小搜索了。一开始以为做成一个三角形就结束了我看很多题解说要压缩状态但是好像不用也可以这里的alphabeta可能打反了,可是不影响理解C

olahiuj的博客 431

POJ1085: Triangle War

Triangle WarTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 1489 Accepted: 595<br />DescriptionTriangle War is a two-player game played on the following triangular grid: <br /><br />Two players, A and B, take turns filling in any dotted line conn

310

POJ 1085 Triangle War 极大极小+剪枝 -

题目地址:http://poj.org/problem?id=1085 极大极小排序,就是注意当一方有个三角形后可以再走一次 有个小小小的问题结果卡一天了...... 代码如下: #include #include #include #include #include #include #include using namespace std; const int maxn=20+5

BRCOCOLI的博客 522

Triangle War--POJ 1085

1、题目类型:博弈、DP。 2、解题思路:(1)构建18条边、9个三角形分别由那三条边组成;(2)模拟输入的残局,并记录A、B获得三角形的差值,中间利用player保持A、B主动权的变换;(3)DP递归剩余情况,寻找player到最后的单步最有情况;(4)判断最终的最大差值MAX,正负即A、B博弈的结果。 3、注意事项:注意构造三角形三边是对应的16进制表示;DP递归过程中注意dp[]的更新。...

weixin_34268843的博客 137

POJ1085 The Triangle War: 记忆化搜索

这是一道关于博弈的题目。我从中得到如下的体会:使用动态规划的方法来解答要比使用极大极小搜索算法,在速度上要快得多。因为极大极小搜索策略每次都要对当前的局面进行某个最大深度的搜索,从中选取出最佳的走法。这样其实是非常耗时的。由于这道题目的本身特点,如果使用动态规划的话,根据dp的思想就是保存搜索过程中的所有状态。在dp的搜索过程中,每次都是非常彻底的搜索,而且由于状态已经描述清楚并记录下来,如果产生了相同的状态,就可以直接使用,这样速度是很快的。但是从这道题目可以开出,dp中状态的描述需要进行保持程序设计的简

如果这是你所爱的,要坚持,并踏实。 2680
上一篇: POJ 1091 跳蚤
下一篇: poj 1077 Eight
bobten2008
博客等级 码龄18年 153粉丝 157原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值