poj3414 花盆

该博客主要介绍了如何利用广搜算法(BFS)解决两个罐子倒水以达到特定容量的问题。代码实现中,定义了罐子的填充、倒空和倾倒操作,并通过一个状态队列和哈希映射来避免重复状态,确保找到最短操作序列。当找到目标容量时,会回溯并输出操作步骤。若无解则输出"impossible"。

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

问题描述:

你有两个罐子,分别有AB升的体积。可以执行以下操作:

  1. FILL(i)从水龙头填充锅i (1 ≤ i ≤ 2);
  2. DROP(i) 将锅i排空至排水管;
  3. POUR(i,j) 从锅i倒入锅j;在此操作之后,要么锅j已满(锅i 中可能还有一些水),要么锅i是空的(并且其所有内容都已移到锅j 中)。

编写一个程序,找出这些操作的最短可能序列,以便在其中一个锅中产生恰好C升的水。

简而言之,就是有三种方式,一是fill函数将罐中的水灌满,二是将罐子的水全部倒空,三是将i罐子的水全部倒到j罐子里,如果j罐子里的水满了就剩着。然后题目要求只要其中一个罐子的水满足题目要求即可。本题采用广搜算法,一开始两个罐子都是没有水的,然后输入赋值给两个罐子。对于得到最终容量的过程,我们极有可能在回溯的时候搞错下标,所以对于每一步的操作,我们都得对它设置一个pos指针,使它指向前一步操作在queue[]队列的下标,即对下标进行回溯,再顺序输出每一步操作。还有一个问题就是每次记录剩余两个罐子的水量,这里采用中间加个逗号来使其成为字符串而不是两个数字来解决这两个罐子剩余水量的唯一性。

代码:

#include<iostream>
#include<string>
#include<sstream>
#include<map>                               //用来标记两个罐子剩余水量的头文件
using namespace std;
 
int v1,v2;                                           //两个瓶子的容量
int c;                                                 //目标残余水量
 
int k1,k2;                                            //记录在某状态时两个瓶子的剩余水量,temporary
 
typedef class                                     //记录某时刻的状态
{
    public:
        int x,y;                                        //当前状态(两个瓶子中的水量)
        int pos;                                      //记录前一状态在队列queue中的下标
        int step;                                     //当前步数
}process;
 
                                                        
string combAB(int a,int b)                  //把整数a、b整合为 "a,b"  的字符串形式(不包括引号),用于标记状态
{
    string s;
    ostringstream oss;
 
    oss<<a;                        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值