题目链接:https://vjudge.net/problem/POJ-3414

题意:给你两个杯子,分别容量为A(1),B(2)和一个C,C是需要经过下列操作,得到的一个升数。
(1) FILL(i) :把编号为i的杯子中水灌满
(2)DROP(i):把编号为i的杯子中水全部倒了
(3)POUR(i,j):把编号为i的杯子中的水倒入编号为j的杯子中,如果编号j杯子中水满了,编号i杯子水就不继续倒了
问:能不能经过有限次(1)(2)(3)操作,得到A,B中其中一个满足C升的水就可以,可以的话输出最少次数并把操作输出,否则输出“impossble”

思路:最少,容易想到bfs,加上倒水过程的模拟,也就6种情况,模拟操作预处理之后,后面会变得很好写,其中的过程,看代码注释吧。
补:我们可以把A,B中升数情况给记录下,出现过的<A,B>就不需要再次bfs了,不然应该会TLE


 #include <iostream>
#include <cstring>
#include<vector>
#include<string>
#include <cmath>
#include <map>
#include <queue>
#include <algorithm>
using namespace std; #define inf (1LL << 31) - 1
#define rep(i,j,k) for(int i = (j); i <= (k); i++)
#define rep__(i,j,k) for(int i = (j); i < (k); i++)
#define per(i,j,k) for(int i = (j); i >= (k); i--)
#define per__(i,j,k) for(int i = (j); i > (k); i--) int A_L, B_L, C_L; //六种操作,都先预处理好
string op[] = { "FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)",
"POUR(1,2)", "POUR(2,1)" };
//其实算一个类用
struct node{ int A,B; //A,B杯子中水升数情况
vector<string > str; //记录操作
// int l;
node(int a = , int b = ){ A = a; B = b; } void Fill(int num){ //(1)操作处理
if (num == ) A = A_L;
else B = B_L;
} void Drop(int num){ //(2)操作处理
if (num == ) A = ;
else B = ;
} void Pour(int num){ //(3)操作处理
if (num == ){
int tmp = A;
A -= (A >= B_L - B ? (B_L - B) : A);
B = (tmp >= B_L - B ? B_L : B + tmp);
}
else{
int tmp = B;
B -= (B >= A_L - A ? (A_L - A) : B);
A = (tmp >= A_L - A ? A_L : A + tmp);
}
} }; void fun(string str){
cout << str << endl;
} void bfs(){ map<pair<int, int>, bool> mp; //记录<A,B>的情况 node init;
/*
pair<int,int > p (init.A, init.B);
mp[p] = true;
*/ queue<node> que;
que.push(init); while (!que.empty()){ node key = que.front();
que.pop(); pair<int, int> o( key.A, key.B );
if (mp[o]) continue; //判断这个<A,B>有误出现过,出现了就不继续下去了
mp[o] = true; //没出现过,标记一下 //六种情况
rep(p, , ){ node tmp = key; if (p == ) tmp.Fill(),tmp.str.push_back(op[]);
else if (p == ) tmp.Fill(), tmp.str.push_back(op[]);
else if (p == ) tmp.Drop(), tmp.str.push_back(op[]);
else if (p == ) tmp.Drop(), tmp.str.push_back(op[]);
else if (p == ) tmp.Pour(), tmp.str.push_back(op[]); //pour(1,2)
else if (p == ) tmp.Pour(), tmp.str.push_back(op[]); //pour(2,1) //其中一个满足即可
if (tmp.A == C_L || tmp.B == C_L){
cout << (int)tmp.str.size() << endl; //遍历tmp的vector
for_each(tmp.str.begin(), tmp.str.end(), fun); return;
} o = make_pair(tmp.A, tmp.B); //也是判断下新的<A,B>是否出现过
if (!mp[o]) que.push(tmp); //出现过,不再压入队列
}
} //无法得出C
cout << "impossible" << endl; } int main(){ ios::sync_with_stdio(false);
cin.tie(); cin >> A_L >> B_L >> C_L; //记录A的最大容量,B的最大容量,标准C
bfs(); return ;
}

kuangbin专题 专题一 简单搜索 Pots POJ - 3414的更多相关文章

  1. Pots(POJ - 3414)【BFS 寻找最短路+路径输出】

    Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...

  2. Pots POJ 3414

    /* *POJ 3414 *简单模板bfs *编程应该为了方便理解,尽量提供接口 */ #include<cstdio> #include<algorithm> #includ ...

  3. kuangbin专题 专题一 简单搜索 Fliptile POJ - 3279

    题目链接:https://vjudge.net/problem/POJ-3279 题意:格子有两面,1表示黑色格子,0表示白色格子,奶牛每次可以踩一个格子,踩到的格子和它周围的上下左右格子都会翻面,也 ...

  4. kuangbin专题总结一 简单搜索

    A - 棋盘问题:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有 ...

  5. Pots POJ - 3414 (搜索+记录路径)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22688   Accepted: 9626   Special J ...

  6. Pots POJ - 3414【状态转移bfs+回溯】

    典型的倒水问题: 即把两个水杯的每种状态视为bfs图中的点,如果两种状态可以转化,即可认为二者之间可以连一条边. 有3种倒水的方法,对应2个杯子,共有6种可能的状态转移方式.即相当于图中想走的方法有6 ...

  7. 搜索入门_简单搜索bfs dfs大杂烩

    dfs题大杂烩 棋盘问题  POJ - 1321 和经典的八皇后问题一样.  给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...

  8. [kuangbin带你飞]专题一 简单搜索

            ID Origin Title 454 / 1008 Problem A POJ 1321 棋盘问题   328 / 854 Problem B POJ 2251 Dungeon Ma ...

  9. poj 3279 Fliptile (简单搜索)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16558   Accepted: 6056 Descrip ...

随机推荐

  1. delphi中获取memo鼠标所在位置的行和列(通过EM_GETRECT消息取得Rect后,自己算一下)

    也是看别人写的,但是不容易找到,就转发一篇delphi版本的 function GetLine(X, Y: integer): TPoint;var  OldFont : HFont;  Hand : ...

  2. 获取同时间段不同的时间 php

    /** * 根据指定日期返回经过的年月 * @param string $sDay 开始日期 * @param string $eDay 结束日期 * @returnse multitype:stri ...

  3. 解决手机提示TF卡受损需要格式化问题

    昨晚因为上QQ FOR PAD后.关机.结果又杯具了.上次无意看到一个SD卡修复命令,收藏起来了.一试,还真管用.现把它写出来.分享给大家.以后出现SD卡受损,千万不要再格式化内存卡了.修复过程:1. ...

  4. C#高性能大容量SOCKET并发(三):接收、发送

    原文:C#高性能大容量SOCKET并发(三):接收.发送 异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存.异步发送我们也需要把每个发送的 ...

  5. CentOS安装mysq

    一安装依赖 yum -y install libaio.so.1 libgcc_s.so.1 libstdc++.so.6 yum -y update libstdc++-4.4.7-4.el6.x8 ...

  6. 百度网盘web端项目总结

    项目背景 网盘作为一个在线备份存储,共享文件的工具类产品,给人们的工作和生活带来了很大的帮助和便利.百度网盘是目前国内使用量最大的网盘产品,至今发展已有4年,总用户数超4亿,为了让用户有着更好的使用体 ...

  7. Java MaxDirectMemorySize

    Refer to for detail: https://dzone.com/articles/default-hotspot-maximum-direct-memory-size 1. Java d ...

  8. qt 维护x86和arm两套编译环境

    1.中间库: 中间库都放在middlewares目录,include头文件相同,所以不需要特殊处理,只要特殊处理lib安装目录, 示例pro文件如下: TEMPLATE = lib TARGET = ...

  9. python发送邮件554DT:SPM已解决

    说明:本例使用163邮箱 一.报错信息 使用SMTP发送邮件遇到以下报错: 554, b'DT:SPM 163 smtp10,DsCowACXeOtmjRRdsY8aCw--.21947S2 1561 ...

  10. ThreadLocal使用原理、注意问题、使用场景

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...