HDU 4023 Game

本文解析了HDU_4023博弈题的策略与思路,通过将棋盘分为五组,详细分析了每组的最优走法及对双方的影响,最终得出胜负的关键在于稳定走位的数量对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDU_4023

这个题目应该是一个博弈类的题目,既然是博弈,那么每一步就要为自己争取最大的利益或者为对方带来最大的损失,那么先放哪一个就要综合对自己的利益与对对方的损失来考虑。

最后谁获得胜利只取决于Alice能走的步数是否比Bob多,同时这一因素又取决于两点:1.在双方都不能为对方带来损失时,谁是先手;2.双方还有多少个稳定的走位。

所谓稳定的走位,就是不论对方如何走,都不会占去的但自己却随时可以走的位置。

从上面分析的角度出发,我们可以把图分成下面5组:

1.1)(2)是一组,分别是AliceBob的稳定走位,所以可以放到最后去考虑。

2.15)单独为一组,综合来讲,(15)一旦放一个瓷砖,那么不仅使自己走出了一步,还能为自己留一个稳定走位,同时又能使对手失去两个位置,所以在(15)放一个瓷砖是效益最高的走法,因而双方最先都会争(15)。

3.3)(4)(5)(6)是一组,至于为什么这四个是一组,我们不妨从Alice的角度分析下一。如果Alice走(5)或(6),那么Alice同时可以获得一稳定走位,并让Bob失去一个位置,如果Alice走(3)(4),那么Alice可以让Bob失去两个位置,所以这两种走法对Alice的收益是相同的。反过来,对Bob而言也是一样的。既然两种走法相同,那么便于我们的统计,不妨先让Alice走(5)(6),Bob走(3)(4),直到一方走完自己的主场,然后再去瓜分剩下的(3)(4)或者(5)(6)。

4.7)(8)(9)(10)是一组,因为都是有一方可以牵制另一方,但另一方不能牵制这一方,具体的分析见下。

5.11)(12)(13)(14)是一组,为什么这样分就不说了,主要说一下双方再走完第3组之后,究竟应该先走第4组还是先走第5组。

首先,从Alice的角度来讲,如果走(7)(8),都可以使Bob失去一个位置,走(11)(12)(13)(14)也是如此,但两种走法对Alice的收益来讲是不同的,如果Alice走(11~14)其中的任意一个,而Bob无论走(7)或(8)都会留一个稳定走位给Alice,而如果Alice走(7)(8)而Bob走(11~14)就没有这种效果了。因而Alice一定会先走(11~14),再走(7)(8)。同样的道理,Bob一定会先走(11~14),再走9)(10

至于7)(8)(9)(10的瓜分,从Alice角度来讲,走(7)(8)不仅会使自己走出了这一步,同时会使Bob失去一个位置,而Alice9)(10却只能使自己走出一步罢了,并不能给Bob带来什么损失,所以Alice一定优先走7)(8,而对于Bob来讲,他一定会先走9)(10,最后如果7)(8或者9)(10有剩余,双方再继续瓜分。

最后再把(1)(2)的统计加进去并看最后该谁走了即可。

综上所述,在统计的过程中,我们要记录3个量,AliceBob剩余的稳定走位和走当前组的图时,该谁先走,如果图是偶数谁先谁后无所谓,但如果图是奇数,先后手的收益就会有所差别。同时,对于走同一组图,如果双方的剩余的稳定走位有相同的部分,我们可以略去这些不去统计,因为最后我们只考虑两人可走的位置数的差,所以相同的部分会抵消掉,因而就不重要了。

#include<stdio.h>
#include
<string.h>
int alice,bob,a[20];
int main()
{
int i,j,k,tt,t,now,tempa,tempb,temp,temp1;
scanf(
"%d",&t);
for(tt=0;tt<t;tt++)
{
for(i=1;i<=15;i++)
scanf(
"%d",&a[i]);
alice
=bob=0;
now
=1;
if(a[15]%2!=0)
{
now
=2;
alice
+=1;
}
tempa
=tempb=0;
tempa
+=a[5];
tempa
+=a[6];
tempb
+=a[3];
tempb
+=a[4];
if(tempa<tempb)
{
tempb
-=tempa;
if(tempb%2!=0)
{
if(now==1)
{
bob
+=tempb/2;
now
=2;
}
else if(now==2)
{
bob
+=tempb/2+1;
now
=1;
}
}
else
bob
+=tempb/2;
}
else if(tempb<tempa)
{
tempa
-=tempb;
if(tempa%2!=0)
{
if(now==1)
{
alice
+=tempa/2+1;
now
=2;
}
else if(now==2)
{
alice
+=tempa/2;
now
=1;
}
}
else
alice
+=tempa/2;
}

tempa
=tempb=0;
tempa
+=a[7];
tempa
+=a[8];
tempb
+=a[9];
tempb
+=a[10];

temp
=0;
temp
+=a[11];
temp
+=a[12];
temp
+=a[13];
temp
+=a[14];

if(temp%2!=0)
now
=3-now;

if(tempa<tempb)
{
tempb
-=tempa;
if(tempb%2!=0)
{
if(now==1)
{
bob
+=tempb/2+1;
now
=2;
}
else if(now==2)
{
bob
+=tempb/2;
now
=1;
}
}
else
bob
+=tempb/2;

}
else if(tempa>tempb)
{
tempa
-=tempb;
if(tempa%2!=0)
{
if(now==1)
{
alice
+=tempa/2;
now
=2;
}
else if(now==2)
{
alice
+=tempa/2+1;
now
=1;
}
}
else
alice
+=tempa/2;
}
alice
+=2*a[1];
bob
+=2*a[2];
printf(
"Case #%d: ",tt+1);
if(now==1)
{
if(bob>=alice)
printf(
"Bob\n");
else
printf(
"Alice\n");
}
else if(now==2)
{
if(alice>=bob)
printf(
"Alice\n");
else
printf(
"Bob\n");
}
}
return 0;
}

  

转载于:https://www.cnblogs.com/staginner/archive/2011/09/10/2173317.html

基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。 智能教学辅助系统 这是一个智能教学辅助系统的前端项目,基于 Vue3+TypeScript 开发,使用 Ant Design Vue 作为 UI 组件库。 功能模块 用户模块 登录/注册功能,支持学生和教师角色 毛玻璃效果的登录界面 教师模块 备课与设计:根据课程大纲自动设计教学内容 考核内容生成:自动生成多样化考核题目及参考答案 学情数据分析:自动化检测学生答案,提供数据分析 学生模块 在线学习助手:结合教学内容解答问题 实时练习评测助手:生成随练题目并纠错 管理模块 用户管理:管理员/教师/学生等用户基本管理 课件资源管理:按学科列表管理教师备课资源 大屏概览:使用统计、效率指数、学习效果等 技术栈 Vue3 TypeScript Pinia 状态管理 Ant Design Vue 组件库 Axios 请求库 ByteMD 编辑器 ECharts 图表库 Monaco 编辑器 双主题支持(专业科技风/暗黑风) 开发指南 # 安装依赖 npm install # 启动开发服务器 npm run dev # 构建生产版本 npm run build 简介 本项目旨在开发一个基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值