鱼C论坛

 找回密码
 立即注册
查看: 440|回复: 11

[其他] 如何量取 6 升水???

[复制链接]
发表于 2024-2-6 18:51:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

需要 6 升水。

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

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

1.png

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

注意:

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

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

答案:

游客,如果您要查看本帖隐藏内容请回复


这位鱼油,如果喜欢本帖子,请订阅>>> 专辑 <<<(不喜欢更要订阅

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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装满

完成
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-6 19:10:00 | 显示全部楼层
学习编程中的Ben 发表于 2024-2-6 19:01
我的答案是:
9灌满,倒给4.-----9里有5,4装满
4倒掉,9再倒给4------9里有1,4装满

~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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

我们小学的家作里有。
现在小学生真卷
@不二如是 ,楼主,这里面还有一个故事,你想听吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-6 19:44:51 | 显示全部楼层
zhangchenyvn 发表于 2024-2-6 19:22
我的答案是:
这道题我做过,

优雅~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-6 19:45:06 | 显示全部楼层
zhangchenyvn 发表于 2024-2-6 19:22
我的答案是:
这道题我做过,

想听
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 19:50:12 | 显示全部楼层

我们班有一个人为了解决这个问题,和家长一起编写了一个程序,在两个水桶之间倒来倒去。。。据说做出了3D效果。。。真卷。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 20:04:52 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2024-2-6 20:14 编辑

我的答案是:信息学照亮世界!
#include <bits/stdc++.h>
using namespace std;

int q[51][2], front, rear;
int prv[5][10][2], dist[5][10];

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

signed main() {
        memset(dist, 255, sizeof(dist));
        q[front = rear = 1][0] = 0;
        q[rear][1] = 0;
        dist[0][0] = 0;
        while (rear + 1 != front) {
                int a = q[front][0], b = q[front][1];
//                printf("%d %d\n", a, b);
                ++front;
                if (dist[4][b] == -1) { // 第一桶水接满
                        dist[4][b] = dist[a][b] + 1;
                        prv[4][b][0] = a;
                        prv[4][b][1] = b;
                        q[++rear][0] = 4;
                        q[rear][1] = b;
                }
                if (dist[a][9] == -1) { // 第二桶水接满
                        dist[a][9] = dist[a][b] + 1;
                        prv[a][9][0] = a;
                        prv[a][9][1] = b;
                        q[++rear][0] = a;
                        q[rear][1] = 9;
                }
                if (dist[a][0] == -1) { // 第二桶水种花
                        dist[a][0] = dist[a][b] + 1;
                        prv[a][0][0] = a;
                        prv[a][0][1] = b;
                        q[++rear][0] = a;
                        q[rear][1] = 0;
                }
                if (dist[0][b] == -1) { // 第一桶水种花
                        dist[0][b] = dist[a][b] + 1;
                        prv[0][b][0] = a;
                        prv[0][b][1] = b;
                        q[++rear][0] = 0;
                        q[rear][1] = b;
                }
                // 第一通水倒进第二桶
                int dt = min(a, 9 - b);
                if (dist[a - dt][b + dt] == -1) {
                        dist[a - dt][b + dt] = dist[a][b] + 1;
                        prv[a - dt][b + dt][0] = a;
                        prv[a - dt][b + dt][1] = b;
                        q[++rear][0] = a - dt;
                        q[rear][1] = b + dt;
                }
                // 第二桶水倒进第一桶
                dt = -min(4 - a, b);
                if (dist[a - dt][b + dt] == -1) {
                        dist[a - dt][b + dt] = dist[a][b] + 1;
                        prv[a - dt][b + dt][0] = a;
                        prv[a - dt][b + dt][1] = b;
                        q[++rear][0] = a - dt;
                        q[rear][1] = 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 -> 第二桶给第一桶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 21:13:37 From FishC Mobile | 显示全部楼层
我的答案是:什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 21:19:54 | 显示全部楼层
zhangchenyvn 发表于 2024-2-6 19:22
我的答案是:
这道题我做过,


事实上仅仅是一个逻辑问题罢了,并没有难度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-7 09:20:57 | 显示全部楼层
zhangjinxuan 发表于 2024-2-6 20:04
我的答案是:信息学照亮世界!

《zhangjinxuan行为》

草,一看才发现你就是zhangjinxuan
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-8 09:36:06 | 显示全部楼层
zhangjinxuan 发表于 2024-2-6 20:04
我的答案是:信息学照亮世界!


精简一下:
#include <bits/stdc++.h>
using namespace std;

int q[51][2], front, rear;
int prv[5][10][2], dist[5][10];

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

signed main() {
    memset(dist, -1, sizeof(dist));
    dist[0][0] = 0;
    q[rear++][0] = 0; q[rear][1] = 0;

    while (front < rear) {
        int a = q[front][0], b = q[front++][1];
        int actions[4][2] = {{4, b}, {a, 9}, {a, 0}, {0, b}};  

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

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

        dt = min(4 - a, b); 
        if (dist[a + dt][b - dt] == -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[na][nb] = dist[a][b] + 1;
    prv[na][nb][0] = a;
    prv[na][nb][1] = b;
    q[rear][0] = na;
    q[rear++][1] = nb;
}

评分

参与人数 1荣誉 +8 鱼币 +8 贡献 +5 收起 理由
zhangjinxuan + 8 + 8 + 5 太强了%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-8 09:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表