第三届蓝桥杯-省赛_10

这次介绍的是第三届蓝桥杯省赛题目的最后一题….

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。

有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。

有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。

下面的列表是可能的操作状态记录:
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5

每行3个数据,分别表示12,8,6升容器中的油量

第一行表示初始状态,第二行表示把12升倒入8升容器后的状态,第三行是8升倒入5升,...

当然,同一个题目可能有多种不同的正确操作步骤。

本题目的要求是,请你编写程序,由用户输入:各个容器的容量,开始的状态,和要求的目标油量,程序则通过计算输出一种实现的步骤(不需要找到所有可能的方法)。如果没有可能实现,则输出:“不可能”。

例如,用户输入:
12,8,5,12,0,0,6

用户输入的前三个数是容器容量(由大到小),接下来三个数是三个容器开始时的油量配置,最后一个数是要求得到的油量(放在哪个容器里得到都可以)

则程序可以输出(答案不唯一,只验证操作可行性):
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5

每一行表示一个操作过程中的油量状态。

注意:

请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。

请不要使用package语句。

源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。

题目求解: 首先录入用户的输入,以逗号为分隔符,分别取值。下一步观察这个分酒的过程,以b为起点,若c不为空,分两种情况倒酒:b为0,b有剩。下一步,将c倒进a中,若c为满的状态,分两种情况:c为0,c有剩。下一步,将a倒入b中,若b为空的状态,分两种情况:a为0,a有剩。再下一步,b倒入c,这是一个循环。那么明显用递归解决了,那递归出口就是三个瓶的任意一个瓶子达到设置的目标值。

图解

java代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package Problem_2;

import java.util.Scanner;

public class Question_10 {
// 用户输入:12,8,5,12,0,0,6
// 用户输入的前三个数是容器容量(由大到小),接下来三个数是三个容器开始时的油量配置,最后一个数是要求得到的油量(放在哪个容器里得到都可以)
static int a, b, c;//三个瓶子的大小
static int aid;//目标酒量
static int sa, sb, sc;//三个瓶子中的酒量

public static void main(String[] args) {
// 用户输入的数字
Scanner s = new Scanner(System.in);
String [] strings = s.nextLine().split(",");
a = Integer.parseInt(strings[0]);
b = Integer.parseInt(strings[1]);
c = Integer.parseInt(strings[2]);
sa = Integer.parseInt(strings[3]);
sb = Integer.parseInt(strings[4]);
sc = Integer.parseInt(strings[5]);
aid = Integer.parseInt(strings[6]);
// 函数入口
f(sa, sb, sc);
}

private static void f(int sa, int sb, int sc) {
System.out.println(sa + "," + sb + "," + sc);
if (sa == aid || sb == aid || sc == aid) {
System.exit(0);
}
/*
* 1.c中瓶子没满,b中倒入c中
* 2.c满,倒入a中
* 3.b空,a倒入b中
*/
if (sb != 0 && sc < c) { //b中有酒,c没满
if (sb <= c - sc) {
f(sa, 0, sc + sb);
} else {
f(sa, sb - (c - sc), c);
}
} else if (sc == c) { //c满,给a倒
if (a - sa <= sc) {
f(a, sb, sc - a + sa);
} else {
f(sa + sc, sb, 0);
}
} else if (sb == 0) { //b空,a给b倒
if (sa >= b) {
f(sa - b, b, sc);
} else {
f(0, sa, sc);
}
}
}
}
-------------本文结束感谢您的阅读-------------

本文标题:第三届蓝桥杯-省赛_10

文章作者:小憧憬

发布时间:2019年10月07日 - 22:10

最后更新:2019年10月07日 - 22:10

原始链接:http://zengbolin.github.io/2019/10/07/第三届蓝桥杯-省赛-10/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持踩坑挖坑跳坑,你的支持将鼓励我继续创新执着.