程序设计_空瓶分酒问题-毕业(学术)论文设计.docVIP

  • 9
  • 0
  • 约6.31千字
  • 约 18页
  • 2018-12-03 发布于广西
  • 举报

程序设计_空瓶分酒问题-毕业(学术)论文设计.doc

空瓶分酒问题 课题名称 空瓶分酒问题 二.课题内容和要求 设计说明及要求:某人有12品脱啤酒一瓶(品脱是英容量单位,1品脱=0.568升),想从中准确地倒出6品脱啤酒。但是他没有6品脱的容器,只有一个8品脱和一个5品脱的容器。请问怎样利用这两个容器和这瓶啤酒,使8品脱的容器中恰好装好了6品脱啤酒?要求使用高级程序设计语言编程实现这一过程,给出所有可能的解法。 例如如下给出的是其中的一种解法: 12, 8, 5 12 ,0, 0 4, 8, 0 4, 3, 5 9 ,3, 0 9, 0, 3 1 ,8, 3 1 ,6, 5 6 ,6, 0。 三.需求分析 各函数的功能: 函数原型:int main() 功能:作为主调函数处理,调用函数f。 入口参数:无 返回值:整型 函数原型:freopen(1.txt, w, stdout); 功能:实现重定向,将标准输出流(默认为屏幕)文件定向到由1.txt指定的文件中,在本程序中就是将程序运行的结果保存在1.txt中。 入口参数:文件名为1.txt,”w”代表写入到文件,stdout 代表写入到文件,和第二个参数 w 连用。 返回值:返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。本程序中没使用它的返回值,这是惯常的做法。 函数原型:void f(int a, int b, int c, int t) 功能:用户自定义的函数,用于解决空瓶分酒问题。 入口参数:3个整型参数a,b,c,分别代表12品脱的啤酒,8品脱的容器,5品脱的容器。 返回值:void类型 四.概要设计 五. 详细设计 #include stdio.h int cap[3] = {12, 8, 5}; // 容量 int beer[100][3] = {12}; // 每步装了多少啤酒 int cnt; // 解法计数 char v[13][9][6]; // 记录是否已访问 void f(int a, int b, int c, int t) // 把a倒入b中,t是步数 { int i; if (beer[t][a] beer[t][b] != cap[b]) //如果a不为空或b不满 { if (beer[t][a] + beer[t][b] cap[b]) { beer[t + 1][b] = cap[b]; beer[t + 1][a] = beer[t][a] + beer[t][b] - cap[b]; } else { beer[t + 1][a] = 0; beer[t + 1][b] = beer[t][a] + beer[t][b]; } beer[t + 1][c] = beer[t][c]; if (v[beer[t + 1][0]][beer[t + 1][1]][beer[t + 1][2]]) // 判断//是否循环 { return; } if (beer[t + 1][1] == 6) // 完成 { printf(--------%d--------\n, ++cnt); for (i = 0; i = t + 1; ++i) { printf(%d\t%d\t%d\n,beer[i][0],beer[i][1],beer[i][2]); } return; } v[beer[t + 1][0]][beer[t + 1][1]][beer[t + 1][2]] = 1; f(a, c, b, t + 1); f(c, a, b, t + 1); f(b, c, a, t + 1); f(c, b, a, t + 1); v[beer[t + 1][0]][beer[t + 1][1]][beer[t + 1][2]] = 0; } } int main() { // freopen(1.txt, w, stdout); // 重定向输出到文件 v[12][0][0] = 1; f(0, 1, 2, 0); f(0, 2, 1, 0); return 0; } 六.测试数据及结果分析 (1) 12 0 0 7 0 5 7 5 0 2 5 5 2 8 2 10 0 2 10 2 0 5 2 5 5 7 0 0 7 5 0 8 4 8 0 4 8 4 0 3 4 5 3 8 1 11 0 1 11 1 0 6 1 5 6 6 0 (2)12 0 0 7 0 5 7

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档