题目链接: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. 基于IdentityServer4的单点登录——项目基本结构与流程

    组成 IdentityServer,Api和Client(客户端,asp .net core)本文以官方demo:https://github.com/IdentityServer/IdentityS ...

  2. 在IOS开发中使用GoogleMaps SDK

    一.申请一个免费的API KEY要使用GoogleMaps SDK,必须要为你的应用申请一个API KEY,API Key可以让你监视你的应用调用api的情况.api key是免费的,你可以在任何调用 ...

  3. git 创建一个空分支

    创建一个分支 使用参数 --orphan,这个参数的主要作用有两个,一个是拷贝当前所在分支的所有文件,另一个是没有父结点,可以理解为没有历史记录,是一个完全独立背景干净的分支. 参考git的帮助文档, ...

  4. 【Python】wifi开关测试

    #!/usr/bin/python # -*- coding: UTF-8 -*- import os import time def find_device(): os.system('adb ki ...

  5. 破处在window7桌面版本下golang连接数上限

    注册表 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 修改或者添加 MaxUserPort 60000 TcpTimedWaitDel ...

  6. C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型

    原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...

  7. UWP StorageFile StorageFolder StorageFileHelper

    //获取表示指定文件系统路径中的文件夹的 StorageFolder. StorageFolder folder1 = await StorageFolder.GetFolderFromPathAsy ...

  8. WIN10以后如果Manifest中不写支持WIN10的话,获取版本号的API获取的是6

    if TOSVersion.Major = 10 then  // 高版本的Delphi(比如Berlin)可以这样写 ShowMessage('Windows 10'); 或者: if Win32M ...

  9. Docker Explanation and Apache Image

    https://blog.sajjan.com.np/2017/02/05/docker-getting-started-containers-ubuntu/ https://blog.sajjan. ...

  10. Ceph OpenSSL

    Ceph OpenSSL 1. SSL介绍 SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信 ...