鱼C论坛

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

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

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

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

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

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

需要 6 升水。

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

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

1.png

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

注意:

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

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

答案:

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


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

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://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装满

完成
小甲鱼最新课程 -> https://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装满

~~
小甲鱼最新课程 -> https://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

我们小学的家作里有。
现在小学生真卷
@不二如是 ,楼主,这里面还有一个故事,你想听吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

优雅~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

想听
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

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

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

  5. void print(int a, int b) {
  6.         if (a == 0 && b == 0) {
  7.                 printf("%d %d\n", a, b);
  8.                 return;
  9.         }
  10.         print(prv[a][b][0], prv[a][b][1]);
  11.         printf("%d %d\n", a, b);
  12. }

  13. signed main() {
  14.         memset(dist, 255, sizeof(dist));
  15.         q[front = rear = 1][0] = 0;
  16.         q[rear][1] = 0;
  17.         dist[0][0] = 0;
  18.         while (rear + 1 != front) {
  19.                 int a = q[front][0], b = q[front][1];
  20. //                printf("%d %d\n", a, b);
  21.                 ++front;
  22.                 if (dist[4][b] == -1) { // 第一桶水接满
  23.                         dist[4][b] = dist[a][b] + 1;
  24.                         prv[4][b][0] = a;
  25.                         prv[4][b][1] = b;
  26.                         q[++rear][0] = 4;
  27.                         q[rear][1] = b;
  28.                 }
  29.                 if (dist[a][9] == -1) { // 第二桶水接满
  30.                         dist[a][9] = dist[a][b] + 1;
  31.                         prv[a][9][0] = a;
  32.                         prv[a][9][1] = b;
  33.                         q[++rear][0] = a;
  34.                         q[rear][1] = 9;
  35.                 }
  36.                 if (dist[a][0] == -1) { // 第二桶水种花
  37.                         dist[a][0] = dist[a][b] + 1;
  38.                         prv[a][0][0] = a;
  39.                         prv[a][0][1] = b;
  40.                         q[++rear][0] = a;
  41.                         q[rear][1] = 0;
  42.                 }
  43.                 if (dist[0][b] == -1) { // 第一桶水种花
  44.                         dist[0][b] = dist[a][b] + 1;
  45.                         prv[0][b][0] = a;
  46.                         prv[0][b][1] = b;
  47.                         q[++rear][0] = 0;
  48.                         q[rear][1] = b;
  49.                 }
  50.                 // 第一通水倒进第二桶
  51.                 int dt = min(a, 9 - b);
  52.                 if (dist[a - dt][b + dt] == -1) {
  53.                         dist[a - dt][b + dt] = dist[a][b] + 1;
  54.                         prv[a - dt][b + dt][0] = a;
  55.                         prv[a - dt][b + dt][1] = b;
  56.                         q[++rear][0] = a - dt;
  57.                         q[rear][1] = b + dt;
  58.                 }
  59.                 // 第二桶水倒进第一桶
  60.                 dt = -min(4 - a, b);
  61.                 if (dist[a - dt][b + dt] == -1) {
  62.                         dist[a - dt][b + dt] = dist[a][b] + 1;
  63.                         prv[a - dt][b + dt][0] = a;
  64.                         prv[a - dt][b + dt][1] = b;
  65.                         q[++rear][0] = a - dt;
  66.                         q[rear][1] = b + dt;
  67.                 }
  68.         }
  69.         print(4, 6);
  70.         return 0;
  71. }
复制代码


0 0 -> 初始状态
0 9 -> 第二桶装满
4 5 -> 第二桶给第一桶
0 5 -> 第一桶清空
4 1 -> 第二桶给第一桶
0 1 -> 第一桶清空
1 0 -> 第二桶给第一桶
1 9 -> 第二桶装满
4 6 -> 第二桶给第一桶
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 21:13:37 From FishC Mobile | 显示全部楼层
我的答案是:什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


事实上仅仅是一个逻辑问题罢了,并没有难度
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

《zhangjinxuan行为》

草,一看才发现你就是zhangjinxuan
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


精简一下:

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

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

  5. void print(int a, int b) {
  6.     if (a == 0 && b == 0) {
  7.         printf("%d %d\n", a, b);
  8.         return;
  9.     }
  10.     print(prv[a][b][0], prv[a][b][1]);
  11.     printf("%d %d\n", a, b);
  12. }

  13. signed main() {
  14.     memset(dist, -1, sizeof(dist));
  15.     dist[0][0] = 0;
  16.     q[rear++][0] = 0; q[rear][1] = 0;

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

  20.         for (auto &act : actions) {
  21.             if (dist[act[0]][act[1]] == -1) {
  22.                 dist[act[0]][act[1]] = dist[a][b] + 1;
  23.                 prv[act[0]][act[1]][0] = a;
  24.                 prv[act[0]][act[1]][1] = b;
  25.                 q[rear][0] = act[0];
  26.                 q[rear++][1] = act[1];
  27.             }
  28.         }

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

  33.         dt = min(4 - a, b);
  34.         if (dist[a + dt][b - dt] == -1) {
  35.             update_state(a, b, a + dt, b - dt);
  36.         }
  37.     }

  38.     print(4, 6);  
  39.     return 0;
  40. }

  41. void update_state(int a, int b, int na, int nb) {  
  42.     dist[na][nb] = dist[a][b] + 1;
  43.     prv[na][nb][0] = a;
  44.     prv[na][nb][1] = b;
  45.     q[rear][0] = na;
  46.     q[rear++][1] = nb;
  47. }
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 20:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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