主题:分酒问题
旧时代的金属
[专家分:0] 发布于 2006-06-22 00:45:00
三个瓶子容量分别是3 5 8
先三个瓶子分别装有3 5 0 的酒
设计程序是装酒变为0 4 4
要求时间复杂度最底
回复列表 (共11个回复)
沙发
旧时代的金属 [专家分:0] 发布于 2006-06-22 12:26:00
大家帮忙解答一下啊
后天就要交了
好急啊
板凳
旧时代的金属 [专家分:0] 发布于 2006-06-22 20:09:00
自己顶~~~~~~~~
3 楼
euc [专家分:4310] 发布于 2006-06-22 21:21:00
先分析一下,是不是可以用搜索做?先把瓶子编号1,2,3,然后一次次地尝试.
比如
1 -> 3 表示1的酒全倒进3号杯
2 -> 1 2的倒到1号杯还剩2两-_-
2 -> 3 剩的2两到进3号杯
......
我若做不出来可别怪我啊..
4 楼
euc [专家分:4310] 发布于 2006-06-22 21:32:00
如果让求最少的次数,那就得用bfs,但咱们不喜欢用一大块内存对吧,只好dfs,这又有个问题:肯定会有很多循环出现的情况,要是能裁减掉重复出现的情况就好了。
5 楼
euc [专家分:4310] 发布于 2006-06-22 21:46:00
哦,可以用一个rec[]数组记录一路搜索过来的所有情况,每次都检查一下当前有没有和rec[]中相同就能解决循环问题了,rec[]还可以记录最终答案:)
其实从0 4 4反过来搜3 5 0也是一样的.
6 楼
旧时代的金属 [专家分:0] 发布于 2006-06-23 10:24:00
思想是差不多
可我还是不太会编
有源程序给看下吗?
不是我要抄
实在是时间来不及了
7 楼
euc [专家分:4310] 发布于 2006-06-23 21:32:00
编的不咋样:
#include <stdio.h>
int limit[3] = {3, 5, 8};
int bottle[3] = {3, 5, 0};
const int obj[3] = {0, 4, 4};
int stack[100][2+3]; /* 记录每一步,从'from'瓶到'to'瓶和当时瓶子的酒 */
int top;
int tag; /* 0表示还未解出 */
int checkrec (int from, int to)
/* 如果记录过这一步,返回1 */
{
int i;
for (i = 0; i < top; ++i)
if (rec[i][0] == from && rec[i][1] == to)
return 1;
return 0;
}
int poll (int from, int to)
{
int sum;
if (bottle[to] == limit[to] || bottle[from] == 0)
return 0;
sum = bottle[to] + bottle[from];
if (sum > limit[to]) {
bottle[to] = limit[to];
bottle[from] = sum - limit[to];
}
else {
bottle[to] += bottle[from];
bottle[from] = 0;
}
return 1;
}
int onestep (int from, int to)
{
if (tag == 1)
return 1;
if (checkrec (from, to))
return 0;
if (poll (from, to) == 0)
return 0;
rec[0] = from;
rec[1] = to;
memcpy (rec[top++]+2, bottle, sizeof(int) * 3);
if (bottle[2] == obj[0] && bottle[3] == obj[1] &&
bottle[4] == obj[2])
tag = 1;
return 1;
}
void diswine (void)
{
if (onestep (0, 1) == 1)
diswine ();
else
memcpy (bottle, rec[--top]+2, sizeof(int)*3);
if (onestep (0, 2) == 1)
diswine ();
else
memcpy (bottle, rec[--top]+2, sizeof(int)*3);
if (onestep (1, 2) == 1)
diswine ();
else
memcpy (bottle, rec[--top]+2, sizeof(int)*3);
if (onestep (1, 0) == 1)
diswine ();
else
memcpy (bottle, rec[--top]+2, sizeof(int)*3);
if (onestep (2, 1) == 1)
diswine ();
else
memcpy (bottle, rec[--top]+2, sizeof(int)*3);
if (onestep (2, 0) == 1)
diswine ();
else
memcpy (bottle, rec[--top]+2, sizeof(int)*3);
}
8 楼
旧时代的金属 [专家分:0] 发布于 2006-06-24 21:42:00
memcpy这个功能是干什么的?
还有这个rec[]好象没定义啊
9 楼
旧时代的金属 [专家分:0] 发布于 2006-06-24 22:31:00
应该加#include<string.h>好象
10 楼
euc [专家分:4310] 发布于 2006-06-25 15:09:00
哦,不好意思
我来回复