回 帖 发 新 帖 刷新版面

主题:分酒问题

三个瓶子容量分别是3 5 8
先三个瓶子分别装有3 5 0 的酒
设计程序是装酒变为0 4 4

要求时间复杂度最底

回复列表 (共11个回复)

沙发

大家帮忙解答一下啊

后天就要交了

好急啊

板凳

自己顶~~~~~~~~

3 楼

先分析一下,是不是可以用搜索做?先把瓶子编号1,2,3,然后一次次地尝试.
比如
1 -> 3 表示1的酒全倒进3号杯
2 -> 1     2的倒到1号杯还剩2两-_-
2 -> 3 剩的2两到进3号杯
......

我若做不出来可别怪我啊..

4 楼

如果让求最少的次数,那就得用bfs,但咱们不喜欢用一大块内存对吧,只好dfs,这又有个问题:肯定会有很多循环出现的情况,要是能裁减掉重复出现的情况就好了。

5 楼

哦,可以用一个rec[]数组记录一路搜索过来的所有情况,每次都检查一下当前有没有和rec[]中相同就能解决循环问题了,rec[]还可以记录最终答案:)

其实从0 4 4反过来搜3 5 0也是一样的.

6 楼

思想是差不多

可我还是不太会编

有源程序给看下吗?

不是我要抄

实在是时间来不及了

7 楼

编的不咋样:
#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 楼

memcpy这个功能是干什么的?
还有这个rec[]好象没定义啊

9 楼

应该加#include<string.h>好象

10 楼

哦,不好意思

我来回复

您尚未登录,请登录后再回复。点此登录或注册