题目:

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

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

有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

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

题目理解:

利用BFS的方法可以搜索出是否能够完成,然后利用有前驱的链表进行记录。

代码:

/*

ID:泊松分酒

LANG:C++

*/

#include

#include

#include

#include

using namespace std;

#include

#define SWAP(x,y) {(x) = (x)^(y); (y)=(x)^(y); (x)=(x)^(y);}

#define MIN(x,y) (x

#define INF 1e9

#define MAXN 100

struct Node{

int a,b,c;

struct Node *pre;

}node[MAXN*MAXN*MAXN],init;//init记录容器的最大容量

bool visit[MAXN][MAXN][MAXN];

void print(struct Node now){//递归输出

if(now.pre != NULL){

print(*now.pre);

}

printf("%d,%d,%d\n", now.a, now.b, now.c);

}

void bfs(int target){

int head = 0, tail = 1;

node[0].pre = NULL;

visit[node[0].a][node[0].b][node[0].c] = true;

while(tail-head>0){

int count = tail-head;

while(count--){

struct Node now = node[head];

if(now.a==target||now.b==target||now.c==target){

print(now);

return;

}

int min = MIN(now.a, init.b-now.b);//a向b中倒

if(!visit[now.a-min][now.b+min][now.c]){

node[tail].a = now.a-min;

node[tail].b = now.b+min;

node[tail].c = now.c;

node[tail].pre = &node[head];

visit[now.a-min][now.b+min][now.c] = true;

tail++;

}

min = MIN(now.a, init.c-now.c);//a向c中倒

if(!visit[now.a-min][now.b][now.c+min]){

node[tail].a = now.a-min;

node[tail].b = now.b;

node[tail].c = now.c+min;

node[tail].pre = &node[head];

visit[now.a-min][now.b][now.c+min] = true;

tail++;

}

min = MIN(init.a-now.a, now.b);//b向a

if(!visit[now.a+min][now.b-min][now.c]){

node[tail].a = now.a+min;

node[tail].b = now.b-min;

node[tail].c = now.c;

node[tail].pre = &node[head];

visit[now.a+min][now.b-min][now.c] = true;

tail++;

}

min = MIN(now.b, init.c-now.c);//b向c

if(!visit[now.a][now.b-min][now.c+min]){

node[tail].a = now.a;

node[tail].b = now.b-min;

node[tail].c = now.c+min;

node[tail].pre = &node[head];

visit[now.a][now.b-min][now.c+min] = true;

tail++;

}

min = MIN(init.a-now.a, now.c);//c向a

if(!visit[now.a+min][now.b][now.c-min]){

node[tail].a = now.a+min;

node[tail].b = now.b;

node[tail].c = now.c-min;

node[tail].pre = &node[head];

visit[now.a+min][now.b][now.c-min] = true;

tail++;

}

min = MIN(init.b-now.b, now.c);//c向b

if(!visit[now.a][now.b+min][now.c-min]){

node[tail].a = now.a;

node[tail].b = now.b+min;

node[tail].c = now.c-min;

visit[now.a][now.b+min][now.c-min] = true;

tail++;

}

head++;

}

}

printf("Impossible\n");

}

int main(){

memset(visit, false, sizeof(visit));

int target;

scanf("%d,%d,%d,%d,%d,%d,%d",

&init.a, &init.b,&init.c,&node[0].a,&node[0].b,&node[0].c,&target);

bfs(target);

return 0;

}

参考样例:

/*

样例1:

输入:

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

样例2:

输入:

30,13,7,30,0,0,5

输出:

30,0,0

17,13,0

17,6,7

24,6,0

24,0,6

11,13,6

11,12,7

18,12,0

18,5,7

样例3:

输入:

31,19,11,31,0,0,5

输出:

31,0,0

12,19,0

12,8,11

23,8,0

23,0,8

4,19,8

4,16,11

15,16,0

15,5,11

样例4:

输入:

65,33,12,65,0,0,18

输出:

65,0,0

32,33,0

32,21,12

44,21,0

44,9,12

56,9,0

56,0,9

23,33,9

23,30,12

35,30,0

35,18,12

*/

附言:

由于没有使用STL,所以代码比较冗长。如果能很好的使用STL,可以很大程度的简约代码。

原文:http://blog.csdn.net/mullerwch/article/details/21028393

蓝桥杯泊松分酒java_【蓝桥杯】泊松分酒相关推荐

  1. 蓝桥杯泊松分酒java_蓝桥杯-泊松分酒 - steven_wjg的个人空间 - OSCHINA - 中文开源技术交流社区...

    泊松是法国数学家.物理学家和力学家.他一生致力科学事业,成果颇多.有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布. 有一次闲暇时,他提出过一个有趣的问题,后称为:"泊松分酒& ...

  2. 蓝桥分酒java_[蓝桥杯][java]海盗分酒

    /*  * 有一群海盗(不多于20人),在船上比拼酒量.过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了.再打开一瓶酒平分,又有倒下的,再次重复......   * 直到开了第4瓶酒,坐着的 ...

  3. 蓝桥杯嵌入式——第十二届蓝桥杯嵌入式国赛

    蓝桥杯嵌入式--第十二届蓝桥杯嵌入式国赛 之前准备省赛的时候用的是旧版的STM32F103,从准备国赛开始就用新版STM32G431平台了,主要是想经过新版的准备学习一下HAL库以及CubeMX的使用 ...

  4. 蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛

    蓝桥杯单片机--第十二届蓝桥杯单片机第一场省赛 目录 蓝桥杯单片机--第十二届蓝桥杯单片机第一场省赛 一.赛题分析 二.问题总结 三.代码 一.赛题分析 前两天实验室的学妹把开发板还给我了,刚好今天没 ...

  5. java蓝桥杯加法变乘法_蓝桥杯-加法变乘法-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  6. 蓝桥杯第十届c语言试题答案,蓝桥杯试题答案(C语言)蓝桥杯试题答案(C语言).pdf...

    蓝桥杯试题答案(C语言)蓝桥杯试题答案(C语言) 1.亲密数:假设有a.b两个数,若a的所有因子之和等于b,b的所有因子之和等于a,并 且a不等于b,则称a和b是一对亲密数.如284和220就是一对亲 ...

  7. 蓝桥杯计算机软件大赛什么时间,蓝桥杯软件大赛培训总结

    <蓝桥杯软件大赛培训总结>由会员分享,可在线阅读,更多相关<蓝桥杯软件大赛培训总结(5页珍藏版)>请在人人文库网上搜索. 1.蓝桥杯软件大赛培训总结"蓝桥杯" ...

  8. 酒至数杯 天空软件下载

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  9. 泊松分酒 java课件_泊松分酒原理 - 我类个擦的个人空间 - OSCHINA - 中文开源技术交流社区...

    有一个12品脱(pint)的酒瓶,里面装满葡萄酒,另有8品脱和5品脱的瓶子各一个.问如何从中分出6品脱的酒出来? 传说泊松年轻时成功解决了该问题,勾起了他对数学的兴趣而投身数学研究,因此该问题被称为泊 ...

  10. 酒至数杯 卡巴斯基杀毒软件

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

最新文章

  1. gan 总结 数据增强_白话GAN及其解决小样本问题的探讨
  2. DAS工具: 利用去重、聚合和评分的策略从宏基因组中恢复基因组
  3. nignx部署Vue单页面刷新路由404问题解决
  4. go语言学习(二)——Gin 框架简介
  5. Swift傻傻分不清楚系列(五) 字符串和字符
  6. linux下查看mysql的当前连接情况
  7. 下班忘打卡了什么后果_工厂园区安装人脸识别门禁系统有什么好处?
  8. 工作120:富文本组件封装
  9. 设计模式(六)原型模式
  10. 二叉搜索树 java版
  11. 各种格式的地图瓦片下载
  12. python爬取酷狗音乐top500_Python爬取酷狗音乐TOP500榜单
  13. Gson解析json数据
  14. 计算机的音量找不到了,音量控制不见了_电脑右下角调音量的小喇叭没有了,是怎么回事?该......
  15. 关于『HTML』:第三弹
  16. 有韵味的女人,是成熟的女人。
  17. oracle 对象类型是什么意思,Oracle对象类型 (转)
  18. 怎么sketch画板导出html,sketch符号和导出画板 – Sketch入门UI设计教程
  19. RKE安装Kubernetes
  20. 对合同履行地约定没有约定或者约定不明确要怎么办

热门文章

  1. 借贷宝java_【人人行(借贷宝)Java面试】借贷宝java后端开发面经。-看准网
  2. html 块级注释,HTML blockquote 标签 | 教程 | codingbefore
  3. 平衡查找树C语言程序,C语言数据结构之平衡二叉树(AVL树)实现方法示例
  4. java log4j 实例_log4j使用例子 - 小代码2016的个人页面 - OSCHINA - 中文开源技术交流社区...
  5. c语言程序 数字时钟的设计,数字时钟C语言设计
  6. 计算机组成原理固件,计算机组成原理(A卷)
  7. Qt程序启动画面QSplashScreen类
  8. Halcon:标准标定板的自制方法
  9. java函数改变参数值_Java函数参数值正在改变
  10. Spring Boot Security 整合 OAuth2 设计安全API接口服务