/*
请设计程序解决“波松分酒问题”
问题如下:
某人有12品脱啤酒一瓶,想从中倒出6品脱,但他没有6品脱的容器,
仅有一个8品脱和一个5品脱的容器,怎样才能将啤酒分为两个6品脱?
抽象分析:
b = 大容器,也表示容积
s = 小容器,也表示容积
(f),(h),(e) 状态f=满, e=空, h=数字,表示容量
运算一: b(f) - s(e) => b(b - s), s(f)
变例 b(h) - s(e) => b(h - s), s(f)
运算二: b(e) + s(f) => b(s), s(e)
变例 b(h) + s(f) => b(f), s(s - b + h)
引出 b(f) - s(h)
b(h) - s(h)
b(e) + s(h)
b(h) + s(h)
如果以瓶中酒的数量为节点, 通过一次以上运算可达到节点之间认为连通.
此题可转化为一个有向图的搜索问题.
即找出.指定节点(12, 0, 0) 和 (6, 6, 0)之间的最小路径.
*/
#include <cstdio>
#include <deque>
#include <map>
#include <utility>
#include <queue>
static int big_max_value[] =
{
12, 8, 12
};
static int small_max_value[] =
{
8, 5, 5
};
static const int big_offset[] =
{
0, 1, 0
};
static const int small_offset[] =
{
1, 2, 2
};
//节点定义
class Node
{
unsigned char mBig;
unsigned char mMid;
unsigned char mSmall;
public:
static void InitMaxValu