不二如是 发表于 2024-2-6 18:51:25

如何量取 6 升水???

本帖最后由 不二如是 于 2024-2-6 20:19 编辑

需要 6 升水。

但是,我们手上没有可以快速量取所需升数的桶。

只有两个不同大小的水桶:



大的水桶可以装 9 升水,小的水桶可以装 4 升。

注意:


[*]不存在缺水的问题,可以把不再需要的水拿去浇灌花园里的花
[*]只能用大小桶

请问:需要怎么做才能正好得到 6 升水?

答案:

**** Hidden Message *****

这位鱼油,如果喜欢本帖子,请订阅>>> 专辑 <<<(不喜欢更要订阅{:10_278:} )

学习编程中的Ben 发表于 2024-2-6 19:01:03

我的答案是:
9灌满,倒给4.-----9里有5,4装满
4倒掉,9再倒给4------9里有1,4装满
4倒掉,9再倒给4-------9里有0,4有1
9灌满-------9里有9,4有1
9倒给4------9里有6,4装满

完成

不二如是 发表于 2024-2-6 19:10:00

学习编程中的Ben 发表于 2024-2-6 19:01
我的答案是:
9灌满,倒给4.-----9里有5,4装满
4倒掉,9再倒给4------9里有1,4装满


~~{:10_275:}

zhangchenyvn 发表于 2024-2-6 19:22:24

本帖最后由 zhangchenyvn 于 2024-2-6 19:23 编辑

我的答案是:
这道题我做过,

步数 小桶 大桶
初始 0 0
1st 0 9
2nd 4 5
3rd 0 5
4th 1 4
5th 1 9
6th 4 6

我们小学的家作里有。
现在小学生真卷
@不二如是 ,楼主,这里面还有一个故事,你想听吗?

不二如是 发表于 2024-2-6 19:44:51

zhangchenyvn 发表于 2024-2-6 19:22
我的答案是:
这道题我做过,



优雅~

不二如是 发表于 2024-2-6 19:45:06

zhangchenyvn 发表于 2024-2-6 19:22
我的答案是:
这道题我做过,



想听{:10_278:}

zhangchenyvn 发表于 2024-2-6 19:50:12

不二如是 发表于 2024-2-6 19:45
想听

我们班有一个人为了解决这个问题,和家长一起编写了一个程序,在两个水桶之间倒来倒去。。。据说做出了3D效果。。。真卷。。。

zhangjinxuan 发表于 2024-2-6 20:04:52

本帖最后由 zhangjinxuan 于 2024-2-6 20:14 编辑

我的答案是:信息学照亮世界!

#include <bits/stdc++.h>
using namespace std;

int q, front, rear;
int prv, dist;

void print(int a, int b) {
        if (a == 0 && b == 0) {
                printf("%d %d\n", a, b);
                return;
        }
        print(prv, prv);
        printf("%d %d\n", a, b);
}

signed main() {
        memset(dist, 255, sizeof(dist));
        q = 0;
        q = 0;
        dist = 0;
        while (rear + 1 != front) {
                int a = q, b = q;
//                printf("%d %d\n", a, b);
                ++front;
                if (dist == -1) { // 第一桶水接满
                        dist = dist + 1;
                        prv = a;
                        prv = b;
                        q[++rear] = 4;
                        q = b;
                }
                if (dist == -1) { // 第二桶水接满
                        dist = dist + 1;
                        prv = a;
                        prv = b;
                        q[++rear] = a;
                        q = 9;
                }
                if (dist == -1) { // 第二桶水种花
                        dist = dist + 1;
                        prv = a;
                        prv = b;
                        q[++rear] = a;
                        q = 0;
                }
                if (dist == -1) { // 第一桶水种花
                        dist = dist + 1;
                        prv = a;
                        prv = b;
                        q[++rear] = 0;
                        q = b;
                }
                // 第一通水倒进第二桶
                int dt = min(a, 9 - b);
                if (dist == -1) {
                        dist = dist + 1;
                        prv = a;
                        prv = b;
                        q[++rear] = a - dt;
                        q = b + dt;
                }
                // 第二桶水倒进第一桶
                dt = -min(4 - a, b);
                if (dist == -1) {
                        dist = dist + 1;
                        prv = a;
                        prv = b;
                        q[++rear] = a - dt;
                        q = b + dt;
                }
        }
        print(4, 6);
        return 0;
}

0 0 -> 初始状态
0 9 -> 第二桶装满
4 5 -> 第二桶给第一桶
0 5 -> 第一桶清空
4 1 -> 第二桶给第一桶
0 1 -> 第一桶清空
1 0 -> 第二桶给第一桶
1 9 -> 第二桶装满
4 6 -> 第二桶给第一桶

小甲鱼的二师兄 发表于 2024-2-6 21:13:37

我的答案是:什么?

陈尚涵 发表于 2024-2-6 21:19:54

zhangchenyvn 发表于 2024-2-6 19:22
我的答案是:
这道题我做过,



事实上仅仅是一个逻辑问题罢了,并没有难度

歌者文明清理员 发表于 2024-2-7 09:20:57

zhangjinxuan 发表于 2024-2-6 20:04
我的答案是:信息学照亮世界!




《zhangjinxuan行为》

草,一看才发现你就是zhangjinxuan

不二如是 发表于 2024-2-8 09:36:06

zhangjinxuan 发表于 2024-2-6 20:04
我的答案是:信息学照亮世界!




精简一下:

#include <bits/stdc++.h>
using namespace std;

int q, front, rear;
int prv, dist;

void print(int a, int b) {
    if (a == 0 && b == 0) {
      printf("%d %d\n", a, b);
      return;
    }
    print(prv, prv);
    printf("%d %d\n", a, b);
}

signed main() {
    memset(dist, -1, sizeof(dist));
    dist = 0;
    q = 0; q = 0;

    while (front < rear) {
      int a = q, b = q;
      int actions = {{4, b}, {a, 9}, {a, 0}, {0, b}};

      for (auto &act : actions) {
            if (dist]] == -1) {
                dist]] = dist + 1;
                prv]] = a;
                prv]] = b;
                q = act;
                q = act;
            }
      }

      int dt = min(a, 9 - b);
      if (dist == -1) {
            update_state(a, b, a - dt, b + dt);
      }

      dt = min(4 - a, b);
      if (dist == -1) {
            update_state(a, b, a + dt, b - dt);
      }
    }

    print(4, 6);
    return 0;
}

void update_state(int a, int b, int na, int nb) {
    dist = dist + 1;
    prv = a;
    prv = b;
    q = na;
    q = nb;
}
页: [1]
查看完整版本: 如何量取 6 升水???