水杯倒水问题
来源:互联网 发布:国家知织产权局官网 编辑:程序博客网 时间:2024/04/28 13:04
今天在网上浏览,发现一个很好玩的问题,水杯倒水问题:
有3个容器,各是20升,13升,7升, 形状不同也不透明。一开始20升的容器里面装了20升水,反正倒来倒去最后要让20升和13升容器各装了10升水
想了好长时间,终于写出了步骤:
20 0 0
7 13 0
7 6 7
14 6 0
14 0 6
1 13 6
1 12 7
8 12 0
8 5 7
15 5 0
15 0 5
2 13 5
2 11 7
9 11 0
9 4 7
16 4 0
16 0 4
3 13 4
3 10 7
10 10 0
网上找到的算法实现如下:用宽度优先搜索 BFS的思想
#include "stdafx.h"
#include <iostream>
#include <cstring> // for memset and memcmp
//from http://blog.csdn.net/bat603
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define HASH(s) hash[s.vol[0]][s.vol[1]][s.vol[2]]
struct state
{
int vol[3];
int depth;
int parent;
};
//瓶子的容量
const int capacity[3] = {20, 17, 3};
const int QUEUE_SIZE = 100000;
state queue[QUEUE_SIZE]; // for bfs
void print_answer(int k)
{
int stack[100];
int p = 0;
int j;
while (k != -1)
{
stack[p++] = k;
k = queue[k].parent;
}
while (p--)
{
std::cout << "Step " << queue[stack[p]].depth << ":/t";
for (j=0; j<3; j++)
{
std::cout << queue[stack[p]].vol[j] << '/t';
}
std::cout << std::endl;
}
}
int main(void)
{
static short int hash[100][100][100]; // for quick check
state start, target, current;
int open, tail;
int i, j;
int delta;
// data set
start.vol[0] = 20; //开始时水的体积
start.vol[1] = 0;
start.vol[2] = 0;
start.depth = 0;
start.parent = -1;
target.vol[0] = 10; //结果的存放,目前是第一个瓶和第二瓶存放
target.vol[1] = 10;
target.vol[2] = 0;
// initialization
memset(hash, 0, sizeof(hash));
queue[0] = start;
open = 0, tail = 1;
HASH(start) = 1;
// bfs search!
while (open < tail)
{
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
if (i != j)
{
current = queue[open];
// from i to j
delta = MIN(current.vol[i], capacity[j] - current.vol[j]);
current.vol[i] -= delta;
current.vol[j] += delta;
if (!HASH(current)) // not duplicated
{
current.depth++;
current.parent = open;
queue[tail++] = current; // enqueue
HASH(current) = 1;
if (memcmp(¤t.vol, &target.vol, sizeof(current.vol)) == 0) // got it
{
print_answer(tail - 1);
return 0;
}
}
}
}
}
open++;
}
std::cout << "no solution found" << std::endl;
return 1;
}
- 水杯倒水问题
- 水杯倒水问题 bfs
- 算法题:水杯倒水的问题
- 三个水杯倒水的问题 还是没写出来
- 3个水杯倒水问题(广度优先搜索)
- 广度优先搜索——水杯倒水问题
- nyoj21 三个水杯倒水
- leetcode 365. Water and Jug Problem 两个水杯倒水问题 + Gcd辗转相除法
- Android 模拟圆形水杯倒水的效果
- 倒水问题
- 倒水问题
- 倒水问题
- 倒水问题
- 倒水问题
- 倒水问题
- 倒水问题
- 倒水问题
- 倒水问题
- 斩立决
- XMLDOM属性
- 也谈项目管理
- 上了大学才明白的事……
- 也谈架构设计
- 水杯倒水问题
- 6531S安装XP系统的方法——解决安装XP蓝屏及硬盘无法使用AHCI模式
- Java Serializable(序列化)
- office2007安装找不到Office.zh-cn/OfficeLR.cab问题
- 解决需求工程中的基本问题
- 年终奖发下来没有?
- 参加工作要明白的事……
- 放下小我 成就大我
- MVC架构中M、V、C的解释