算法学习–分酒问题(BFS)[通俗易懂]

算法学习–分酒问题(BFS)[通俗易懂]有4个红酒瓶子,它们的容量分别是:9升,7升,4升,2升开始的状态是[9,0,0,0],也就是说:第一个瓶子满着,其它的都空着。允许把酒从一个瓶子倒入另一个瓶子,但只能把一个瓶子倒满或把一个瓶子倒空,不能有中间状态。这样的一次倒酒动作称为1次操作。假设瓶子的容量和初始状态不变,对于给定的目标状态,至少需要多少次操作才能实现?本题就是要求你编程实现最小操作次数的计算。输入:最终状…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

有4个红酒瓶子,它们的容量分别是:9升, 7升, 4升, 2升
开始的状态是 [9,0,0,0],也就是说:第一个瓶子满着,其它的都空着。

允许把酒从一个瓶子倒入另一个瓶子,但只能把一个瓶子倒满或把一个瓶子倒空,不能有中间状态。
这样的一次倒酒动作称为1次操作。

假设瓶子的容量和初始状态不变,对于给定的目标状态,至少需要多少次操作才能实现?
本题就是要求你编程实现最小操作次数的计算。

输入:最终状态(空格分隔)
输出:最小操作次数(如无法实现,则输出-1)

例如:
输入:
9 0 0 0
应该输出:
0

输入:
6 0 0 3
应该输出:
-1

输入:
7 2 0 0
应该输出:
2

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <set>
using namespace std;

//状态类
class state { 
   
public:
	string str;//目前状态
	int step;//从原始状态到目前状态需要的步骤数
	state(string s, int st) :str(s), step(st) { 
   }
};

char glass[4] = { 
    '9','7','4','2' };//四个杯子的容量 

int bfs(string target) { 
   
	set<string> s;
	queue<state> q;
	q.push(state("9000", 0));//初始状态加入队列
	s.insert("9000");
	while (!q.empty()) { 
   
		state tmp = q.front();//取出第一个元素 
		q.pop();//弹出第一个元素 
		if (tmp.str == target) { 
   
			return tmp.step;
		}
		int k = tmp.step;
		//尝试从第i个杯子倒到第j个杯子 
		for (int i = 0; i < 4; i++) { 
   
			for (int j = 0; j < 4; j++) { 
   
				if (i == j)continue;//不能自己倒给自己 
				//1.把自己倒完(目标杯子现有量+要倒入的量<=目标杯子容量)主要看别的杯子能否装的下
				if (tmp.str[i] + tmp.str[j] - '0' <= glass[j]) { 
   
					string temp = tmp.str;
					temp[j] += temp[i] - '0';
					temp[i] = '0';
					if (s.find(temp) == s.end()) { 
   //如果这个状态之前没有出现过,就加入到集合中
						s.insert(temp);
						q.push(state(temp, k + 1));
					}
				}
				//2.把别的杯子装满 主要看自己能不能装满别的杯子
				if (tmp.str[i] + tmp.str[j] - '0' >= glass[j]) { 
   
					string temp = tmp.str;
					int a = glass[j] - '0';
					int b = temp[j] - '0';
					temp[i] -= a - b;
					temp[j] = glass[j];
					if (s.find(temp) == s.end()) { 
   
						s.insert(temp);
						q.push(state(temp, k + 1));
					}
				}
			}
		}
	}
	return -1;
}

int main() { 
   
	int n1, n2, n3, n4;
	cin >> n1 >> n2 >> n3 >> n4;
	string str = to_string(n1) + to_string(n2) + to_string(n3) + to_string(n4);
	cout << bfs(str) << endl;
	return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180090.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月19日 下午10:46
下一篇 2022年10月19日 下午11:00


相关推荐

  • msfconsole攻击工具_服务器console接口是干嘛的

    msfconsole攻击工具_服务器console接口是干嘛的?Msfconsole工具概括:???Msfconsole简称(msf)是一款常用的渗透测试工具,包含了常见的漏洞利用模块和生成各种木马,方便于安全测试人员的使用.(1)进行端口扫描.(2)进行服务的扫描.(3)扫描3306(Mysql)端口的弱口令.(4)在msf模块里也可以使用nmap进行扫描.(5)扫描了服务器是用WinXP,然后对服务器进行渗透测试.

    2025年9月28日
    5
  • 38.XDMA寄存器详解2-H2C、C2H通道寄存器组剖析

    38.XDMA寄存器详解2-H2C、C2H通道寄存器组剖析目录 1 上节回顾 2 H2C 寄存器剖析 2 1H2C 通道标识寄存器 0x00 2 2H2C 通道控制寄存器 0x04 2 3H2C 通道状态寄存器 0x40 2 4H2C 通道完成描述符数量寄存器 0x48 2 5H2C 通道对齐寄存器 0x4C 2 6H2C 通道查询模式回写地址寄存器 0x88 0x8C 2 7H2C 通道中断掩码寄存器 0x90 2 8H2C 通道性能监视控制寄存器 0xC0 2 9H2C 通道周期计数性能寄存器 0xC4 0xC8 2

    2026年3月18日
    1
  • 最简单DIY串口蓝牙硬件实现方案

    最简单DIY串口蓝牙硬件实现方案51 单片机物联网智能小车系列文章目录第一篇 最简单 DIY 的 51 蓝牙遥控小车设计方案第二篇 最简单 DIY 串口蓝牙硬件实现方案文章目录 51 单片机物联网智能小车系列文章目录前言一 最简单 DIY 串口蓝牙硬件实现方案是什么 二 制作步骤 1 搭建 ESP32 开发环境 2 下载代码 3 根据软件和硬件完成硬件连接三 仿真与调试 1 准备好硬件 小车上电和打开 arduino 串口监视器 输入指令 点击发送 2 接收小车返回的响应总结前言 daodanjishui 物联网核心原创技术之最简单 DIY 串口

    2026年3月18日
    1
  • CMD查看端口占用情况,8080端口被TIM占用了「建议收藏」

    CMD查看端口占用情况,8080端口被TIM占用了「建议收藏」CMD查看端口占用情况,8080端口被TIM占用了安装新版本dubboAdmin的时候,启动后端项目dubbo-admin-server报一下错误:org.apache.catalina.LifecycleException:Protocolhandlerstartfailed atorg.apache.catalina.connector.Connector.startInternal(Connector.java:1008) atorg.apache.catalina.util.Li

    2022年5月19日
    70
  • matlabfor循环产生矩阵_matlab形成矩阵

    matlabfor循环产生矩阵_matlab形成矩阵参考:http://www.ilovematlab.cn/thread-101148-1-1.html这个ok:clc;clear;h=[10987654321];size=length(h);t=zeros(1,size);t(1)=h(1);t(1,2:size)=h(size:-1:2);H=toeplitz(h,t)这个也ok:clc;clear;h=[109…

    2022年10月7日
    6
  • arp内网攻击_外网和内网怎么设置

    arp内网攻击_外网和内网怎么设置arpspoof是一款进行arp欺骗的工具,攻击者通过毒化受害者arp缓存,将网关mac替换为攻击者mac,然后攻击者可截获受害者发送和收到的数据包,可获取受害者账户、密码等相关敏感信息。本次测试是在局域网内进行,利用kali截获centos相关数据攻击者ip:192.168.157.129受害者ip:192.168.157.2501、在kali中开启端口转发功能:echo…

    2022年10月7日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号