题目:

给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作

FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2);

DROP(i) 将第i个容器抽干

POUR(i,j) 将第i个容器里的水倒入第j个容器(这次操作结束后产生两种结果,一是第j个容器倒满并且第i个容器依旧有剩余,二是第i个容器里的水全部倒入j中,第i个容器为空)

现在要求你写一个程序,来找出能使其中任何一个容器里的水恰好有C升,找出最少操作数并给出操作过程

输入:

有且只有一行,包含3个数A,B,C(1<=A,B<=100,C<=max(A,B))

输出:

第一行包含一个数表示最小操作数K

随后K行每行给出一次具体操作,如果有多种答案符合最小操作数,输出他们中的任意一种操作过程,如果你不能使两个容器中的任意一个满足恰好C升的话,输出“impossible”

分析:

简单的BFS,难点在于回溯,给每个状态用数组记录路径

代码

#include<iostream>
#include<queue>
#include<string>
using namespace std;
const int INF = 0x3f3f3f3f;
int a, b, c;
int used[105][105];
struct node
{
int x, y;
int flag;
int path[1005];//数组中0-5分别表示6种不同操作
}st;
string print[6] = { "FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(1,2)", "POUR(2,1)" };
void bfs()
{
queue<node> q;
for (int i = 0; i <= a; ++i)
{
for (int j = 0; j <= b; ++j)
used[i][j] = INF;
}
memset(used, 0, sizeof(used));
st.x = 0, st.y = 0;
st.flag = 0;
memset(st.path, -1, sizeof(st.path));
q.push(st);
used[st.x][st.y] = 1;
while (q.size())
{
node temp = q.front();
q.pop();
if (temp.x == c || temp.y == c)
{
cout << temp.flag << endl;
for (int i = 0; i < temp.flag; ++i)
cout << print[temp.path[i]] << endl;
return;
}
for (int i = 0; i < 6; ++i)
{
node now = temp;
now.flag++;
if (i == 0 && now.x != a)
{
now.x = a;
if (!used[now.x][now.y])
{
used[now.x][now.y] = 1;
now.path[temp.flag] = 0;
q.push(now);
}
}
else if (i == 1 && now.y != b)
{
now.y = b;
if (!used[now.x][now.y])
{
used[now.x][now.y] = 1;
now.path[temp.flag] = 1;
q.push(now);
}
}
else if (i == 2 && now.x != 0)
{
now.x = 0;
if (!used[now.x][now.y])
{
used[now.x][now.y] = 1;
now.path[temp.flag] = 2;
q.push(now);
}
}
else if (i == 3 && now.y != 0)
{
now.y = 0;
if (!used[now.x][now.y])
{
used[now.x][now.y] = 1;
now.path[temp.flag] = 3;
q.push(now);
}
}
else if (i == 4)
{
if (now.x + now.y > b)
{
now.x -= b - now.y;
now.y = b;
}
else
{
now.y += now.x;
now.x = 0;
}
if (!used[now.x][now.y])
{
used[now.x][now.y] = 1;
now.path[temp.flag] = 4;
q.push(now);
}
}
else if (i == 5)
{
if (now.x + now.y > a)
{
now.y -= a - now.x;
now.x = a;
}
else
{
now.x += now.y;
now.y = 0;
}
if (!used[now.x][now.y])
{
used[now.x][now.y] = 1;
now.path[temp.flag] = 5;
q.push(now);
}
}
}
}
cout << "impossible" << endl;
}
int main()
{
cin >> a >> b >> c;
bfs();
return 0;
}

POJ3414 Pots( BFS搜索)的更多相关文章

  1. POJ3414—Pots(bfs加回溯)

    http://poj.org/problem?id=3414                                       Pots Time Limit: 1000MS   Memor ...

  2. POJ3414 Pots —— BFS + 模拟

    题目链接:http://poj.org/problem?id=3414 Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  3. POJ-3414.Pots.(BFS + 路径打印)

    这道题做了很长时间,一开始上课的时候手写代码,所以想到了很多细节,但是创客手打代码的时候由于疏忽又未将pair赋初值,导致一直输出错误,以后自己写代码可以专心一点,可能会在宿舍图书馆或者Myhome, ...

  4. POJ3414 Pots BFS搜素

    题意:通过题目给出的三种操作,让任意一个杯子中的水到达一定量 分析:两个杯子最大容量是100,所以开个100*100的数组记录状态,最多1w个状态,所以复杂度很低,然后记录一下路径就好 注:代码写残了 ...

  5. POJ 3414 Pots (BFS/DFS)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7783   Accepted: 3261   Special Ju ...

  6. hdu 1240:Asteroids!(三维BFS搜索)

    Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. hiho_1139_二分+bfs搜索

    题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值. 题目链接:二分     最小化最大值,考虑采用二分搜索.对所有的边长进 ...

  8. hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  9. BFS搜索

    参考博客:[算法入门]广度/宽度优先搜索(BFS) 适用问题:一个解/最优解 重点:我们怎么运用队列?怎么记录路径? 假设我们要找寻一条从V0到V6的最短路径.(明显看出这条最短路径就是V0-> ...

  10. Horse Pro(带负坐标的bfs搜索)

    Horse Pro bfs搜索,但图中存在负值坐标,两种方法解决. 用数组标记,将原点设为300,300 用map标记 http://oj.jxust.edu.cn/contest/Problem?i ...

随机推荐

  1. 震惊,微信小程序可以设置网络字体!真香

    准备工作,获取字体链接 还原设计稿的时候需要用到如下特殊字体(google 的 Montserrat): https://fonts.google.com/specimen/Montserrat 选择 ...

  2. 耗时三年开源的H5商城,生产级代码实战

    waynboot-mall 商城项目是我从疫情开始初期着手准备开发的,到如今 2023 年底,已经过了 3 年多的时间. 从项目初期到现在,一个人持续迭代,修复漏洞,添加功能,经历了前端开发工具从 v ...

  3. [ICPC2014 WF] Pachinko

    [ICPC2014 WF] Pachinko 题面翻译 题目描述 有一个宽度为 \(w\) 高度为 \(h\) 的方格纸, $ w \times h$ 的格子中,有一些是空的,有一些是洞,有一些是障碍 ...

  4. 关于yolov3在训练自己数据集时容易出现的bug集合,以及解决方法

    早先写了一篇关于yolov3训练自己数据集的博文Pytorch实现YOLOv3训练自己的数据集 其中很详细的介绍了如何的训练自定义的数据集合,同时呢笔者也将一些容易出现的bug写在了博文中,想着的是可 ...

  5. 【2016】CloneCD和IsoBuster配合使用以提取VCD中的文件

    **笔记记录于:2016-11-24 ** 本文章仅供用于技术研究用途,请勿利用文章内容操作用于违反法律的事情. 起因: 公司老总让我提取下VCD中的文件以备份下,但是把光碟放进DVD光驱中发现只有几 ...

  6. 【笔记整理】忽略https证书校验

    import requests url = "https://sam.huat.edu.cn:8443/selfservice/" # 默认不忽略ssl证书,如果有证书问题的网站会 ...

  7. 华企盾DSC导致导出文件报错常见处理方法

    1.导出文件的进程和打开该文件的进程启用OLE控制是否都是未勾选,以及启用虚拟重定向是否设置一致(要么都勾选要么都不勾) 2.用procmon监控个人模式下导出非加密的文件,搜索writefile的进 ...

  8. 【C#】【System.IO】关于拷贝文件夹以及(Directory和DirectoryInfo、File和FileInfo)的区别

    本次问题是想要拷贝文件夹,但是找了一圈发现只有File有Copy或者FileInfo的CopyTo,并没有Directory的拷贝操作方法. 针对C#中拷贝文件夹的方法就是先生成一个目标文件夹(des ...

  9. 【并发编程特性】并发编程特性之五种特性的探讨-volatileandsynchronized

    title: [并发编程特性]并发编程特性之五种特性的探讨 date: 2021-11-18 10:16:05.492 updated: 2021-12-26 17:43:10.414 url: ht ...

  10. Python——第二章:基础数据类型

    下面是需要掌握的知识点: int, float, bool  (5星)str   (5星)list    (5星)tuple   (2星)set     (1星)dict    (5星)bytes   ...