斗地主大师题解(宽搜)

文章讨论了一个关于斗地主大师利用其特殊能力在斗地主游戏中调整欢乐豆数量的问题,目的是从初始欢乐豆P变为幸运数字Q,通过最少的局数计算策略。

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

斗地主大师

时间限制:1000ms 内存限制:65536kB

描述

斗地主大师今天有P个欢乐豆,他夜观天象,算出了一个幸运数字Q,如果他能有恰好Q个欢乐豆,就可以轻松完成程设大作业了。

斗地主大师显然是斗地主大师,可以在斗地主的时候轻松操控游戏的输赢。
1.他可以轻松赢一把,让自己的欢乐豆变成原来的Y倍
2.他也可以故意输一把,损失X个欢乐豆(注意欢乐豆显然不能变成负数,所以如果手里没有X个豆就不能用这个能力)
而斗地主大师还有一种怪癖,扑克除去大小王只有52张,所以他一天之内最多只会打52把斗地主。
斗地主大师希望你能告诉他,为了把P个欢乐豆变成Q个,他至少要打多少把斗地主?

输入

第一行4个正整数 P,Q,X,Y 0< P,X,Q <= 2^31, 1< Y <= 225

输出

输出一个数表示斗地主大师至少要用多少次能力 如果打了52次斗地主也不能把P个欢乐豆变成Q个,请输出一行 “Failed”

样例输入

样例输入1

2 2333 666 8

样例输入2

1264574 285855522 26746122 3

样例输出

输出样例1:

Failed

输出样例2:

33

题解

首先按要求输入p,q,x,y。注意它们上限为2^31,必须用long long定义

long long p,q,x,y;
cin>>p>>q>>x>>y;

其次以p(欢乐豆的数量)为参数宽搜

bfs(p);
void bfs(int a)//为避免重名,参数名定义为a
{
   
}

宽搜的队列需要记录两个值:现有欢乐豆数、当前局数。且欢乐豆数上限超出int上限,要用long long定义

struct node
{
   
	long long n,d;//n:当前欢乐豆数 d:当前局数
};
queue<node> qu;

我们还需要一个标记数组,避免重复搜索

map<long long,int> m;

接下来我们回到函数,将初值加入队列并标记

qu.push({
   a,0});
m[a]=1;

这里有一种要考虑的特殊情况:现有的欢乐豆数p正好等于幸运数q。这种情况直接输出0

if(a==q)//之前用a记录的p
{
   
	cout<<0
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值