农夫约翰有三个容量分别为 A,B,C升的挤奶桶。

最开始桶 A 和桶 B 都是空的,而桶 C 里装满了牛奶。

有时,约翰会将牛奶从一个桶倒到另一个桶中,直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。

这一过程中间不能有任何停顿,并且不会有任何牛奶的浪费。

请你编写一个程序判断,当 A 桶是空的时候,C 桶中可能包含多少升牛奶,找出所有的可能情况。

输入格式
共一行,包含三个整数 A,B,C。

输出格式
共一行,包含若干个整数,表示 C 桶中牛奶存量的所有可能情况,请将这些数字按升序排列。

数据范围
1≤A,B,C≤20
输入样例1:
8 9 10
输出样例1:
1 2 8 9 10
输入样例2:
2 5 10
输出样例2:
5 6 7 8 9 10
//bfs
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 21;int A, B, C;
bool st[N][N][N];//标记每个状态是否出现
struct Node
{int a, b, c;
}q[N * N * N];
int hh, tt;void insert(int a, int b, int c)
{if (!st[a][b][c]){q[ ++ tt] = {a, b, c};//这个状态已经出现了st[a][b][c] = true;}
}void bfs()
{q[0] = {0, 0, C};//初始状态st[0][0][C] = true;while (hh <= tt)//队列不空{auto t = q[hh ++ ];int a = t.a, b = t.b, c = t.c;insert(a - min(a, B - b), min(a + b, B), c);//第一个倒入第二个insert(a - min(a, C - c), b, min(a + c, C));//第一个倒入第三个insert(min(a + b, A), b - min(A - a, b), c);//第二个倒入第一个insert(a, b - min(C - c, b), min(c + b, C));//第二个倒入第三个insert(min(a + c, A), b, c - min(c, A - a));//第三个倒入第一个insert(a, min(b + c, B), c - min(c, B - b));//第三个倒入第二个}
}int main()
{cin >> A >> B >> C;bfs();for (int c = 0; c <= C; c ++ )for (int b = 0; b <= B; b ++ )if (st[0][b][c]){cout << c << ' ';break;}return 0;
}
思考我们的递归终止条件什么,显然不是a,b,c出界,
而是这个状态被遍历过,那么必然也从这个状态转移过
,所以在此便可终止递归,在遍历到每一个状态的时候,
标记为true,,千万不要回溯。 因为如果回溯了,那么
在最后统计答案的时候会所有状态都没有被访问过,
那么如果我们在结束递归的同时输出答案会使得答案重复
,而且无法保证c值从小到大然后输出答案是外层循环枚举c, 内层枚举b,才能从小到大输出哦
//DFS
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>using namespace std;const int N = 21;int A, B, C;
bool vis[N][N][N];void dfs(int a, int b, int c) {if (vis[a][b][c]) return;vis[a][b][c] = true;dfs(a - min(a, B - b), min(a + b, B), c);dfs(a- min(a, C - c), b, min(a + c, C));dfs(min(a + b, A), b - min(b, A - a), c);dfs(a, b - min(b, C- c), min(c + b, C));dfs(min(a + c, A), b, c - min(c, A - a));dfs(a, min(b + c, B), c - min(c, B - b));
}int main(void) {scanf("%d%d%d", &A, &B, &C);dfs(0, 0, C);for (int c = 0; c <= C; c ++ ) for (int b = 0; b <= B; b ++ ) if(vis[0][b][c]) {cout << c << ' ';break;}return 0;
}

母亲的牛奶(BFS,DFS)相关推荐

  1. 母亲的牛奶(dfs)

    [题目描述] 农夫约翰有 3 个容量分别为 a,b,c 升的桶. 最初 a,b 桶都是空的,而 c 桶是装满牛奶的.有时,农夫把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.并且每次倒牛奶,牛 ...

  2. USACO 1.4 Mother's Milk 母亲的牛奶(经典的dfs倒水问题)

    [USACO1.4.4]Mother's Milk 母亲的牛奶 Time Limit:10000MS  Memory Limit:65536K Total Submit:42 Accepted:27  ...

  3. 邻结矩阵的建立和 BFS,DFS;;

    邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...

  4. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

    [问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...

  5. LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...

  6. LeetCode 1034. 边框着色(BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给出一个二维整数网格 grid,网格中的每个值表示该位置处的网格块的颜色. 只有当两个网格块的颜色相同,而且在四个方向中任 ...

  7. 全局路径规划:图搜索算法介绍1(BFS/DFS)

    对于全局路径规划的设计,我们先要了解什么是图搜索,在此之前,要先知道什么是图: 可以看到,图有很多种,有无向图,有向图,节点之间还可以有不同的weight, 用于表述从节点与节点直接迁移的代价. 而图 ...

  8. 深度搜索 java_java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法...

    java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法 public class City { String name; int id; static int idCounter = ...

  9. 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)

    前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...

最新文章

  1. html页面不显示横向滚动条,css横向滚动条不显示?
  2. 【C#】【APK】APK文件解析AXML-层层深入APK文件解析之一
  3. 经典数据结构和算法 双端队列 java
  4. Redis入门(一)
  5. java int parse_java中Integer.parseInt和Integer.valueOf的区别
  6. WPF--ComboBox数据绑定
  7. django 1.8 官方文档翻译: 6-6-4 部署静态文件
  8. python做算法分析_Python实现迪杰斯特拉算法过程解析
  9. 1112个人赛,最长回文串常见算法讨论
  10. win32开发(添加菜单)
  11. python字节码执行函数_做一个字节码追踪器,从内部理解 Python 的执行过程
  12. PNG in IE - 1 - pngfix.js
  13. d-s证据理论 matlab代码2
  14. 在美国租房子需要考虑什么问题?
  15. mc服务器资源包在什么文件夹,资源包
  16. 敬业签手机版便签软件怎么绑定QQ或微信互联登录?
  17. Java--多线程之并发,并行,进程,线程(一)
  18. 乘法口诀测试小软件,60000道乘法口诀练习题模板(4至9以内各10000题)
  19. SSL/TLS Suffers ‘Bar Mitzvah Attack’漏洞检测方法及修复建议
  20. 方差、标准差和协方差三者之间的定义与计算

热门文章

  1. 背景图片与图片对盒子的影响
  2. 计算机中的正负数表示
  3. html的英文全称怎么读,HTML标签英文全称对照.doc
  4. git 手动master_git 如何撤销一次remote的master commit?
  5. 自学Java系列 笔记2 高级类特性1
  6. Xinetd服务的安装与配置【转载】
  7. 班章管家稳定放心:五万元应该怎样理财?理财产品怎样选?
  8. @Value注解从配置文件中读取数组
  9. 宋君强 学科评估 计算机科学,宋君强
  10. linux 命令运行kodi,在Ubuntu/Debian/Raspbian中安装Kodi for Linux的方法