[广搜BFS] Pots

描述

You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:


  1. FILL(i)        fill the pot i (1 ≤ ≤ 2) from the tap;
  2. DROP(i)      empty the pot i to the drain;
  3. POUR(i,j)    pour from pot i to pot j; after this operation either the pot j is full (and there may be some water left in the pot i), or the pot i is empty (and all its contents have been moved to the pot j).

     

Write a program to find the shortest possible sequence of these operations that will yield exactly C liters of water in one of the pots.

输入

On the first and only line are the numbers AB, and C. These are all integers in the range from 1 to 100 and C≤max(A,B).

输出

The first line of the output must contain the length of the sequence of operations K. The following K lines must each describe one operation. If there are several sequences of minimal length, output any one of them. If the desired result can’t be achieved, the first and only line of the file must contain the word ‘impossible’.

样例输入

3 5 4

样例输出

6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)
解题分析

首先,我们观察一下题目,可以发现,题目对某一个状态,给出了一些操作,让我们去求一个最小的操作次数,达到一个指定的目标状态。那么很明显了基本上,这就是一道广搜BFS的题目,关键在于,我们如何去实现题目所提到的这些操作,如何去设置我们的访问数组来表示当前这个状态我们已经达到过了。其实比较容易,我们设置节点Node里面包含一个字符串记录我们的操作,然后两个数A,B记录我们这个节点的情况下,A,B容器中水的含量。而水的含量直接也成为我们的状态,我们设置一个二维数组去标记我们的状态,如果已经访问过了,我们在后续就不需要再放入队列了。最后我们数一数字符串中操作的次数,或者说我们还可以进一步地在Node节点里面设置一个step变量记录我们的操作长度,这都是可以的。最后我们处理一下操作的字符串,输出答案即可。

代码演示
#include <iostream>
#include <cmath>
//#include <iomanip>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <list>
#include <bitset>
#include <queue>
#include <stack>
#include <cstdlib>
using namespace std;
int A,B,C;
char op[]={'F','D','P'};
string ans="no";
bitset<105> visited[105];struct Node{string seq;int A,B;Node(string s="",int a=0,int b=0) : seq{s} , A(a) , B(b) { }
};void bfs(){queue<Node> q;q.push({"",0,0});char c;while(!q.empty()){Node tmp=q.front();q.pop();visited[tmp.A][tmp.B]=1;if(tmp.A==C || tmp.B==C){ans=tmp.seq;break;}for(int i=0;i<3;i++){c=op[i];string nseq=tmp.seq+c;int nA,nB;if(c=='F'){for(int j=1;j<=2;j++){nA=tmp.A;nB=tmp.B;string m=nseq+char(j+'0');if(j==1) nA=A;else nB=B;if(!visited[nA][nB])q.push({m,nA,nB});}}else if(c=='D'){for(int j=1;j<=2;j++){nA=tmp.A;nB=tmp.B;string m=nseq+char(j+'0');if(j==1) nA=0;else nB=0;if(!visited[nA][nB])q.push({m,nA,nB});}}else if(c=='P'){for(int i=1;i<=2;i++)for(int j=1;j<=2;j++){if(i==j) continue;if(i==1 && j==2){string m = nseq + char(i+'0') + char(j+'0');nB=tmp.B+tmp.A;nA=0;if(nB>B){nA=nB-B;nB=B;}if(!visited[nA][nB])q.push({m,nA,nB});}else if(i==2 && j==1){string m = nseq + char(i+'0') + char(j+'0');nA=tmp.B+tmp.A;nB=0;if(nA>A){nB=nA-A;nA=A;}if(!visited[nA][nB])q.push({m,nA,nB});}}}}}
}int main(){scanf("%d%d%d",&A,&B,&C);bfs();int len=ans.size();char a,b;if(ans!="no"){int count=0;for(int i=0;i<len;i++){if(!isdigit(ans[i])){count++;}}printf("%d\n",count);for(int i=0;i<len;i++){if(ans[i]=='F'){a=ans[++i];printf("FILL(%d)\n",a-'0');}else if(ans[i]=='P'){a=ans[++i];b=ans[++i];printf("POUR(%d,%d)\n",a-'0',b-'0');}else if(ans[i]=='D'){a=ans[++i];printf("DROP(%d)\n",a-'0');}}}else printf("impossible\n");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java -jar

java [JVM参数] -jar [jar文件路径] [应用参数&#xff0c;包括springboot特定参数]* JVM 参数必须在-jar之前 * 应用参数一般在jar文件路径之后java -jar excel.jar java -jar -Dloader.pathlibx /path/to/yourApp.jar java -jar -Dloader.pathlibx /path/to/yourApp.jar --…

Behind the Code:Polkadot 如何实现全球协作与去中心化治理?

2024 年 6 月 16 日&#xff0c;《Behind the Code: Web3 Thinkers》第二季第二集上线。本集中&#xff0c;ChaosDAO 联合创始人兼 Novasama Technologies 首席财务官 Leemo 深入探讨了 Polkadot 生态系统中的全球协作力量&#xff0c;以及这种协作如何推动去中心化治理的创新与…

聊聊语法糖

语法糖&#xff08;Syntactic sugar&#xff09;是指编程语言中添加的某种语法&#xff0c;这种语法对语言的功能没有影响&#xff0c;但更方便程序员使用&#xff0c;并能增加程序的可读性&#xff0c;减少代码出错的机会。 历史&#xff1a; 语法糖这一术语是由英国计算机科…

C++:你用过MultiIndex容器吗?

作为C开发者&#xff0c;我们对键值容器非常熟悉&#xff0c;例如std::set、std::map、std::unordered_map等。这些容器以其强大的功能和高效的性能&#xff0c;成为我们处理数据存储和检索任务时的得力助手。但是你用过多键容器&#xff08;MultiIndex&#xff09;吗&#xff…

关于团队生存的小讨论

大家好&#xff0c;我是阿赵。   今天出门上班的时候&#xff0c;在电梯里面看到了信乐团的海报&#xff0c;信乐团要来我家附近开演唱会了。可惜&#xff0c;是没有了信的信乐团。   我以前读大学的时候&#xff0c;组建过自己的乐队&#xff0c;所以对当时很多乐队都非常…

在 macOS 上使用 Homebrew 安装和配置 Python 及 Tk 库

在 macOS 上&#xff0c;系统自带的 /usr/bin/python3 版本较旧&#xff0c;且直接升级系统自带的 Python 版本可能会影响系统稳定性。因此&#xff0c;推荐使用 Homebrew 来安装和管理 Python 及其相关库。本文将详细介绍如何通过 Homebrew 安装和配置 Python 3 及 Tk 库&…

CentOS中的rename命令

目录 CentOS中的rename命令基本语法使用示例注意事项安装prename CentOS中的rename命令 在CentOS系统中&#xff0c;rename命令通常是指util-linux包中提供的版本&#xff0c;它用于批量重命名文件&#xff0c;但与Perl版本的rename命令相比&#xff0c;功能较为简单&#xff…

QT 中setVisible()和setEnabled()的区别

setVisible(bool)和setEnabled(true)在PyQt&#xff08;以及其他类似的图形用户界面框架&#xff09;中分别用于控制控件的可见性和可用性&#xff0c;它们之间的主要区别如下&#xff1a; setVisible(bool) 功能&#xff1a;这个函数用于设置QWidget控件的可见状态。参数&am…

AI创作在论文写作中扮演什么角色?

近年来&#xff0c;随着科技的快速发展&#xff0c;AI已经逐渐渗透到了生活中的方方面面&#xff0c;其中也包含着学术领域。 作为学生党&#xff0c;你是否还在为期末论文&#xff0c;大学生实践报告而发愁&#xff1f; 有了这些AI写作神器&#xff0c;大学生们再也不用在期…

深度学习500问——Chapter11:迁移学习(3)

文章目录 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 11.3.2 边缘分布自适应 11.3.3 条件分布自适应 11.3.4 联合分布自适应 11.3.5 概率分布自适应方法优劣性比较 11.3.6 特征选择 11.3.7 统计特征对齐方法 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 数据分布自适…

Unity做一个剪辑声音的工具 在编辑器模式实时剪辑声音

Unity音频剪辑工具的实现 在游戏开发中&#xff0c;音频是一个至关重要的元素。音频剪辑工具能够帮助开发者高效地编辑和管理音频文件。本文将解析一个基于Unity编辑器的音频剪辑工具的实现方法 效果 工具功能 该音频剪辑工具允许用户在Unity编辑器中加载音频片段&#xff0…

Linux 一键部署 Nginx1.26.1 + ModSecurity3

前言 ModSecurity 是 Apache 基金会的一个开源、高性能的 Web 应用程序防火墙(WAF),它提供了强大的安全规则引擎,用于检测和阻止各种攻击行为,如 SQL 注入、XSS 跨站点脚本攻击等。而 nginx 是一个高性能的 Web 服务器,常用于处理大量的并发请求,具有很高的负载均衡能力…

k8s及etcd的每日自动备份及故障时的还原脚本

#!/bin/bash# 定义备份目录 BACKUP_DIR"/data/backupdata/k8s" K8S_CONFIG_BACKUP"${BACKUP_DIR}/k8s_config_backup_$(date %Y%m%d%H%M%S).tar.gz" ETCD_BACKUP"${BACKUP_DIR}/etcd_backup_$(date %Y%m%d%H%M%S).db" TEMP_DIR"${BACKUP_DI…

<component>标签的介绍和使用

目录 基本使用&#xff1a; 使用组件对象&#xff1a; 使用动态组件与 keep-alive keep-alive简单介绍及使用&#xff1a; 属性&#xff1a; 生命周期钩子&#xff1a; 举例&#xff1a; 缓存单个组件&#xff1a; 缓存多个组件&#xff08;通过路由动态&#xff09;&…

如何修炼个人影响力,怎样有效地影响他人

一、教程描述 影响力是用一种别人所乐于接受的方式&#xff0c;改变他人的思想和行动的能力。影响力又被解释为战略影响、印象管理、善于表现的能力、目标的说服力以及合作促成的影响力等。影响力表明了一种试图支配与统帅他人的倾向&#xff0c;从而才使一个人采取各种劝说、…

iOS封装FrameWork

我们是整个项目封装给客户app用&#xff0c;项目里面有资源文件&#xff1a;xib和图片文件。有第三方&#xff0c;也有.a文件和第三方给我们的frameWork。下面记录下大体遇到的问题及遇到的冲突解决办法。 第一部分&#xff1a;封装frameWork 1.首先准备好&#xff0c;要封装的…

在阿里云服务器Linux系统上从头到尾实现Webapp的部署(安装卸载JDK、安装Tomcat、安装配置MySQL)

输入yum list | grep jdk 选择 devel是软件包中的典型命名格式 devel表示这个包是开发工具相关的 里面包含内容是最完整的 x86表示cpu架构是x86_64 还有openjdk表示开源版本 输入yum install java-1.8.0-openjdk-devel.x86_64 开始下载 遇到问你 is this ok? 输入y表示ok 输…

C#中的枚举类-自定义属性

在实际开发过程中&#xff0c;我们常常会用到枚举类&#xff0c;使用枚举的时候往往有着各种使用条件&#xff0c;如何给枚举加入使用条件呢&#xff1f; 答案就是我们的——自定义属性 废话不多说&#xff0c;上代码 枚举类 首先我们要有一个枚举类 public enum XXXX枚举…

0621# C++八股 1.成员初始化列表的概念?以及为什么使用它会快一点?2.重写Override和重载Overload区别

成员初始化列表的概念&#xff1f;以及为什么使用它会快一点&#xff1f; 成员初始化列表的概念 在C中&#xff0c;成员初始化列表是构造函数的一部分&#xff0c;它用于在构造函数体执行之前初始化类的成员变量。成员初始化列表在构造函数参数列表之后&#xff0c;以冒号 : …

Unity与Android交互通信系列(6)

本节主要讲述广播订阅。 使用AndroidJavaProxy代理接口&#xff0c;我们可以很方便的实现对Android端事件的订阅&#xff0c;灵活的进行Android端与Unity端的代码交互。通过AndroidJavaProxy代理&#xff0c;我们也可以在安卓端使用 BroadcastReceiver 接收广播&#xff0c;然后…