【POJ 3414】Pots(BFS)

该博客介绍了如何利用BFS(广度优先搜索)算法解决POJ 3414题目,即在给定两个不同容量的水壶中找到最短操作序列来得到特定体积的水。博主分析了题意,提供了操作类型,并展示了通过编程实现寻找最少操作次数的思路和代码示例。

Pots

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

FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap;
DROP(i) empty the pot i to the drain;
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.


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

Output
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’.


Sample Input
3 5 4
Sample Output
6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)


题意:

输入数据:A,B,C。A表示容器a容量,B表示容器b容量,C为将要做的事:使任意一个容器装有C容量的水(C<=max(A,B))
你能做三种操作:
1.FILL(i) :将容器i(序号,i=1或2即A和B)用水装满
2.DROP(i):将容器i(序号)里的水倒光
3.POUR(i,j):将容器i里的水倒入j(序号)中。有两种可能性:如果两容器水量之和小于容器j(序号)容量,则容器i里的水被倒光;如果如果两容器水量之和大于容器j(序号)容量,则容器j里装满水。
输出最少操作次数和每次的操作


思路:

哎呀,这题有种似曾相识的感觉。经分析得这题也是有六次操作,和HDU 1495-非常可乐很类似嘛。稍微麻烦点的就是要输出一对操作字符串。既然是字符串的话,结构体里加一个str变量,然后每次strcpy就可以了。思路很类似,详细见注释。


代码示例:
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#define MAX 105
using namespace std;
int A,B,C;
bool vis[MAX][MAX];
struct point {
    int vol_a;//容器a 
    int vol_b;//容器b 
    int step;//次数统计 
    char str[MAX][MAX];//字符串拷贝 
};

queue<point> que;

bool bfs()
{
    //初始化 
    point p,q;
    memset(vis,false,sizeof(vis));
    p.vol_a=0,p.vol_b=0,p.step=0;
    vis[0][0]=true;
    while(!que.empty()) que.pop();
    //开始将结点压入队列 
    que.push(p);
    while(!que.empty())
    {
        p=que.front();
        que.pop();
        //判断出口并输出 
        if(p.vol_a==C||p.vol_b==C)
        {
            cout<<p.step<<endl;
            for(int i=1;i<=p.step;i++)
                cout<<p.str[i]<<endl;
            return true;
        } 
        //把a倒满 
        if(p.vol_a==0)
        {
            q=p;
            q.vol_a=A;
            q.step++;
            strcpy(q.str[q.step],"FILL(1)");
            if(!vis[q.vol_a][q.vol_b]){
                vis[q.vol_a][q.vol_b]=true;
                que.push(q);
            } 
        }
        //把a中水倒出 
        else if(p.vol_a<=A)
        {
            q=p;
            q.vol_a=0;
            q.step++;
            strcpy(q.str[q.step],"DROP(1)");
            if(!vis[q.vol_a][q.vol_b])
            {
                vis[q.vol_a][q.vol_b]=true;
                que.push(q);
            }
            //a->b
            if(q.vol_b<B)  //如果b没装满 ,才能往b内装 
            {
                q=p;
                if(q.vol_a+q.vol_b<=B)  //如果 总量都不足以装满b容量 
                {
                    q.vol_b=q.vol_a+q.vol_b;  
                    q.vol_a=0;
                }
                else  //如果 总量超过了b容量 
                {
                    q.vol_a=q.vol_a+q.vol_b-B;  //两句顺序不能反!! 
                    q.vol_b=B;
                }
                q.step++; //步数统计 
                strcpy(q.str[q.step],"POUR(1,2)"); //字符串赋给q.str[步数(即可认为是“层次”,bfs每一层都会遍历所有)] 
                if(!vis[q.vol_a][q.vol_b])
                {
                    vis[q.vol_a][q.vol_b]=true;
                    que.push(q);
                }
            }
        }
        //把b倒满 (不分别解释,与上相对应) 
        if(p.vol_b==0)
        {
            q=p;
            q.vol_b=B;
            q.step++;
            strcpy(q.str[q.step],"FILL(2)");
            if(!vis[q.vol_a][q.vol_b])
            {
                vis[q.vol_a][q.vol_b]=true;
                que.push(q);
            } 
        }
        //把b中水倒出 
        else if(p.vol_b<=B)
        {
            q=p;
            q.vol_b=0;
            q.step++;
            strcpy(q.str[q.step],"DROP(2)");
            if(!vis[q.vol_a][q.vol_b])
            {
                vis[q.vol_a][q.vol_b]=true;
                que.push(q);
            }
            //b->a
            if(q.vol_a<A)
            {
                q=p;
                if(q.vol_a+q.vol_b<=A)
                {
                    q.vol_a=q.vol_a+q.vol_b;
                    q.vol_b=0;
                }
                else 
                {
                    q.vol_b=q.vol_a+q.vol_b-A;
                    q.vol_a=A;

                }
                q.step++;
                strcpy(q.str[q.step],"POUR(2,1)");
                if(!vis[q.vol_a][q.vol_b])
                {
                    vis[q.vol_a][q.vol_b]=true;
                    que.push(q);
                }
            }
        }
    }
    return false;
}

int main()
{
    while(cin>>A>>B>>C&&A&&B&&C)
    {
         bool flag=bfs();
         if(flag==false) cout<<"impossible"<<endl;
    }
    return 0;
}
内容概要:本文档是一份关于“超声谐波成像中幅超声谐波成像中幅度调制聚焦超声引起的全场位移和应变的分析模型(Matlab代码实现)度调制聚焦超声引起的全场位移和应变的分析模型”的Matlab代码实现研究资料,重点构建了一个用于分析在超声谐波成像过程中,由幅度调制聚焦超声所引发的生物组织全场位移与应变的数学模型。该模型通过Matlab仿真手段实现了对声场激励下组织力学响应的精确计算与可视化,有助于深入理解超声激励与组织变形之间的物理机制,提升超声弹性成像的精度与可靠性。文档还附带多个相关科研领域的Matlab/Simulink代码实例,涵盖无人机控制、路径规划、电力系统仿真、信号处理、机器学习等多个方向,展示了强大的技术支撑与应用拓展能力。; 适合人群:具备Matlab编程基础,从事医学超声成像、生物力学建模、信号与图像处理等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于超声弹性成像中组织力学响应的仿真与分析;②为开发新型超声诊断技术提供理论模型与算法支持;③作为多物理场耦合仿真的教学与研究案例,促进跨学科技术融合。; 阅读建议:建议读者结合Matlab代码逐行理解模型实现细节,重点关注声场建模、组织力学方程求解及位移应变后处理部分。同时可参考文档中提供的其他仿真案例,拓宽研究思路,提升综合科研能力。
标题基于SpringBoot的高校餐饮档口管理系统设计与实现AI更换标题第1章引言介绍高校餐饮档口管理系统的研究背景、意义、国内外现状及论文方法与创新点。1.1研究背景与意义阐述高校餐饮档口管理现状及系统开发的重要性。1.2国内外研究现状分析国内外高校餐饮管理系统的研究与应用进展。1.3研究方法及创新点概述本文采用的研究方法及系统设计的创新之处。第2章相关理论总结与高校餐饮档口管理系统相关的现有理论。2.1SpringBoot框架理论阐述SpringBoot框架的原理、优势及其在Web开发中的应用。2.2数据库设计理论介绍数据库设计的基本原则、方法和步骤。2.3系统安全理论讨论系统安全设计的重要性及常见安全措施。第3章系统需求分析对高校餐饮档口管理系统的功能需求、性能需求等进行详细分析。3.1功能需求分析列举系统需实现的主要功能,如档口管理、订单处理等。3.2性能需求分析分析系统对响应时间、并发处理能力等性能指标的要求。3.3非功能需求分析阐述系统对易用性、可维护性等非功能方面的需求。第4章系统设计详细描述高校餐饮档口管理系统的设计过程。4.1系统架构设计给出系统的整体架构,包括前端、后端和数据库的设计。4.2模块设计详细介绍各个功能模块的设计,如用户管理、档口信息管理等。4.3数据库设计阐述数据库表结构的设计、数据关系及索引优化等。第5章系统实现与测试介绍高校餐饮档口管理系统的实现过程及测试方法。5.1系统实现系统各模块的具体实现过程,包括代码编写和调试。5.2系统测试方法介绍系统测试的方法、测试用例设计及测试环境搭建。5.3系统测试结果与分析从功能、性能等方面对系统测试结果进行详细分析。第6章结论与展望总结本文的研究成果,并展望未来的研究方向。6.1研究结论概括高校餐饮档口管理系统的设计与实现成果。6.2展望指出系统存在的不足及未来改进和扩展的方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值