HDU - 1495 非常可乐(BFS,数学)

HDU - 1495 非常可乐(BFS,数学)

巨佬的数学解法

在这里插入图片描述

#include<iostream>
using namespace std;
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
int main()
{
	int a,b,c;
	while(cin>>a>>b>>c&&(a&&b&&c))
	{
		a/=gcd(b,c);
		if(a&1) cout<<"NO"<<endl;
		else cout<<a-1<<endl;
	}
	return 0;
}

BFS

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 110;
int w[3];
struct node
{
	int a,b,c,cnt;
};
bool st[N][N][N];
void bfs()
{
	memset(st,false,sizeof st);
	st[w[0]][0][0] = true;
	queue<node>que;
	que.push({w[0],0,0,0});
	while(que.size())
	{
		node t = que.front();que.pop();
		int a = t.a,b = t.b,c = t.c;
		if(a == b && c == 0 || a == c && b == 0 || b == c  && a == 0) //当其中一种平分的状态出现直接输出
		{
			cout << t.cnt << endl;
			return ;
		}
		for(int i = 0; i < 3; i ++) //枚举每一种倒水的情况 i -> j
			for(int j = 0; j < 3; j ++)
			{
				int d[3] = {a, b, c};
				if(i != j && (d[i] != 0 || d[j] != w[j])) // 不能自己倒自己且i杯子不为空,j杯子不能为满
				{
					int h = min(w[j] - d[j],d[i]);//倒入j最多的水量
					d[j] += h,d[i] -= h;
					if(!st[d[0]][d[1]][d[2]])
						que.push({d[0],d[1],d[2],t.cnt + 1}),st[d[0]][d[1]][d[2]] = true;
				}
			}
	}
	cout << "NO" << endl;
}
int main()
{
	while(cin >> w[0] >> w[1] >> w[2], w[0] + w[1] + w[2])//用数组存方便后面的判断
	{
		if(w[0] & 1) cout << "NO" << endl;//奇数肯定不能平分
		else bfs();
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wa_Automata

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值