分油问题C语言.doc

设有大小不等的X,Y,Z三个无刻度的油桶,分别能够盛满油X,Y,Z例如,X8,Y5,Z3,并约定X YZ。初始时,仅X油桶盛满油,Y和Z油桶为空。要求程序寻找一种最少的分油步聚,在某个油桶中分出T升油例如T4。解令三个油桶的盛油情况为倒油过程的状态,则倒油过程就是状态变化的过程。为了记录倒油过程,程序引入倒油状态队列,将倒油过程中产生的状态存储在队列中。队列的每个元素记录每次分油后各个油桶的分油后各个油桶的盛油量和倒油轨迹等有关信息。程序反复从队列中取出第一个还未检查过的状态,对该状态下的每个油桶判断其是否可以倒出油,及是否可以倒进油。由于油桶没有刻度,分油时只能将某个油桶倒满或倒空。程序分别按倒空或倒满两种可能的倒油动作执行不同的处理,产生新的倒油状态,为避免某个倒油状态在队列中重复出现,程序只将未曾出现过的新状态及其倒油轨迹信息存入队列中,假定程序检查了相当多的状态后,或能找到解,或能确定问题无解。倒油程序算法如下算法-无刻度油桶分油输入各桶容量和目标容量;将初始状态存入倒油状态队列;设置其它初始值;do对状态队列中第一个还未检查的元素在还未检查完每个倒出的桶且还未找到解且还未确定无解情况下循环if倒出桶有油在还未检查完每个桶且还未找到解且还未确定无解情况下循环if当前桶不是倒出桶且桶还有空确定本次倒油量;在队列中检查倒油后的结果状态是否在队列中出现;if结果状态不在队列中出现将结果状态和轨迹信息存入队列;if有桶中的油达到目标容量设置找到解标志;if还未找到解修正队列第一个还未检查过的元素指针;if队列中的元素都已检查过设置无解标志;while还未找到解且还未确定无解;if找到解根据倒油步聚的轨迹信息,形成倒油步聚序列;输出倒油步聚序列;倒油队列中的元素应包含下列信息各桶的盛油量,该状态是从哪一个桶源桶倒向哪一个桶目标桶而形成的,形成该状态的元素在队列中的位置。根据以上算法编写如下程序。程序代码如下includestdio.hdefine N 100define BUCKETS 3struct eleint stateBUCKETS; /*各桶盛油量*/int sbucket; /*源桶*/int obucket; /*目标桶*/int last; /*轨迹元素在队列中的下标*/qN; /*队列*/int fullBUCKETS;int i,j,k,found,unable,wi,wj,v,targ;int head,tail;void main/*输入各桶容量和目标容量*/printfEnter volume of buckets. ;fori0;iBUCKETS;iscanfd,/*如要检查full0full1full2,相应代码在此*/printfEnter volume of targ. ;scanfd, /*检查targfull0的代码在此**设置将初始状态存入倒油状态队列等初值*/q0.state0full0;fori1;iBUCKETS;iq0.statei0;q0.sbucket0;q0.obucket0;q0.last0;foundunable0;headtail0;do/*对状态队列中第一个还未检查过的元素在还未检查完每个倒出的桶且还未找到解且还未确定无解情况下循环*/fori0;iBUCKETSfoundunable;iifqhead.statei0 /*倒出桶有油**在还未检查完每个油桶且还未找到解且还未确定无解情况下循环*/forj0;jBUCKETSfoundunable;jifjiqhead.statejfullj /*当前桶不是倒出桶且桶还有空**确定本次倒油量*/ifqhead.stateifullj-qhead.statejvfullj-qhead.statej;else vqhead.statei;wiqhead.statei-v;wjqhead.statejv;/*在队列中检查倒油后的结果状态是否在队列中出现*/fork0;ktail;kifqk.stateiwiqk.statejwj break;ifktail /*结果状态不在队列中出现**将结果状态和轨迹信息存入队列*/tail;qtail.stateiwi;qtail.statejwj;qtail.state3-i-jqhead.state3-i-j;qtail.sbucketi1;qtail.obucketj1;qtail.lasthead;/*如有桶达到目标盛油量,则设置找到解标志*/ifwitargwjtargfound1;iffound /*还未找到解*/head; /*修正队列第一个还未检查过元素指针*/ifheadtail /*队列中的元素都已检查过*/unable1; /*设置无解标志*/whilefoundunable; /*还未找到解且还未确定无解*/iffound /*找到解**根据倒油步聚的轨迹信息,形成倒油步聚序列*/itail;j-1;do /*原倒油步聚逆向链接,现改为正向链接*/kqi.last;qi.lastj;ji;ik;whilej;/*输出倒油步聚序列*/forkqk.last;k0;kqk.lastprintf5d to 2d,qk.sbucket,qk.obucket;fori0;iBUCKETS;iprintf4d,qk.statei;printf ;else printfUnable ;分油我们首先用字母a,b,c代表8斤桶,5斤桶和3斤捅。规定倒油的顺序为 a-b-c-a 并且必须符合如下规则 1.b5斤桶倒空后才能从a8斤桶中取油。 2c3斤桶盛满后才能向a8斤捅中倒油。 我们设从a中往b倒油x次,从c往a倒油y次,那么最后a中剩下的油应该为8-5x3y斤,按照题意,我们得到如下方程, 8-5x3y4 我们为了得到这个方程的解,应按照上述的倒油规则不断的倒下去,直到a中或b中油的重量为4斤为止,另外也可以改变倒油的规则,看能否找到最好的倒油步聚。代码includestdio.hint i;main int a,y,z; printf Full a ,Empty b,c,Get i; /*读入3个容器的容量和最后需要的数量*/ scanfddd, gettia,y,z;gettiint a,int y,int z int b0,c0; /*b,c为二个容器的实际重量*/ printfad bd cd 4d4d4d ,a,y,z,a,b,c; whileaibi /*如果满足要求退出循环*/ ifb /*如果b为空,从a往b倒油*/ a-y;by; else ifcz az;c0 /*如果c已满,从c往a倒油*/ else ifbz-c b-z-c;cz; /*如果b的重量大于c的剩余重量,倒满c*/ else cb;b0; /*否则将b中的油全部倒入c*/ printf4d4d4d ,a,b,c; 运行结果 Full a, Empty b,c, Get i 8 5 3 4volumea8 b5 c3start8 0 03 5 03 2 36 2 06 0 21 5 21 4 34 4 0

C语言经典分油问题,分油问题C语言.doc相关推荐

  1. C语言经典编程(浙大版C语言第三版)详解

    C语言经典编程详解 – 一览表: 1.[C语言经典编程]练习2-1 Programming in C is fun! (5分) 2.[C语言经典编程]练习2-3 输出倒三角图案 (5分) 3.[C语言 ...

  2. c语言经典测试,c语言经典写作测试(非常完整).doc

    c语言经典写作测试(非常完整) 歼隔啄穷潘破赵曲潘彰迭挪辫锹晓蔼斗君秉缚迈奄信菩敲褒辣爬丹业蟹庇捞广囤哉观远跌寇阀稳驻听摔选逮亩医防厄近滤完嚎赋识辩纶颇胃爱熙赂脆撅违镁挽忠槛堂艳襟昼喂戊契页刚淄寿置邻 ...

  3. c语言经典编程282例xiazai,C语言经典编程282例源码(入门级)

    [实例简介] [实例截图] [核心代码] 目 录 第1章 初识C语言1 实例001 第一个C语言程序2 实例002 一个完整的C语言程序2 实例003 输出名言3 实例004 用TC 2.0打开文件4 ...

  4. c++语言经典编程282例,《C语言经典编程282例(C语言学习路线图)》怎么样_目录_pdf在线阅读 - 课课家教育...

    第1章 初识C语言 实例001 第一个c语言程序 实例002 一个完整的c语言程序 实例003 输出名言 实例004 用tc 2.0打开文件 实例005 计算正方形的周长 第2章 简单的c程序 实例0 ...

  5. 100例C语言经典编程题 | 浙大版C语言题目集第三版,助力你C语言从入门到精通

    获取每道题详细解答请在公众号[C you again]"C语言题目集"栏目查看. 下载pdf版本请在公众号[C you again]回复"c-pdf"自行获取. ...

  6. C语言判断一个数是否为素数(质数),C语言经典例题计算素数,C语言二级重点

    素数又称质数.所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如29就是素数,因为它不能被 2~28 的任一整数整除. (思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ ...

  7. c语言编程经典实例利润,C语言经典编程实例100题解答

    C语言经典编程实例100题 答案+答案 C语言经典编程实例100题C语言程序实例100个(一) [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数,都是多少, 1.程序 ...

  8. C语言经典实例:1-10例:三角求和、显示所占字节数、自增自减运算while语句输出最小值、计算快递费用、学生成绩统计

    文章目录 C语言经典实例:1-10例:三角求和.显示所占字节数.自增自减运算while语句输出最小值.计算快递费用.学生成绩统计等 1.程序的编写工具 2.项目的创建 3.C语言经典实例1-10编写的 ...

  9. 猴子偷桃c语言编程软件,c语言经典算法——猴子偷桃问题

    题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿 ...

  10. c语言 swap交换函数_C语言经典100题(14)

    1 上期答案揭晓 首先给大家看看上一篇文章C语言经典100题(13)中第三部分编程题的答案: #includeint main(){ int i,x,y,z; for(i=100;i<1000; ...

最新文章

  1. 【数理知识】《数值分析》李庆扬老师-第1章-数值分析与科学计算引论
  2. 20、Power Query-数据合并、拆分
  3. Hadoop分布式文件系统--HDFS结构分析
  4. js中json的创建和解析
  5. 前置交换机数据交换_我们的数据科学交换所
  6. [转载]Hibernate 一对一 双向关联
  7. Word | 添加图题/图注、插入题注、设置插入题注快捷键...
  8. SVC的主要作用及应用范围
  9. Ubuntu 16.04安装sogou拼音输入法
  10. 【华录杯】深度学习吸烟打电话识别
  11. NDK51_OpenGL:FBO
  12. linux 光标切换快捷键,光标操作快捷键,光标快捷键
  13. Mind+敌我双方发射炮弹小游戏
  14. 大数据能力_大数据基础能力_脑图
  15. 很遗憾未能成功连接服务器神武,神武十年《见证》逍遥游戏里的超级学霸 最希望被别人抄“作业”...
  16. python爬虫——大众点评——商户评论
  17. 【老卫搞机】135期:华为开发者联盟社区2022年牛人之星奖品开箱!
  18. jar文件打不开解决办法
  19. 系统进程启动流程分析(二)
  20. 【机器人学习】三自由度康复机器人运动学分析()

热门文章

  1. QSettings介绍与使用
  2. Stata:CHFS中国家庭金融调查数据库清洗和处理
  3. 人工智能 漆桂林_漆桂林
  4. android 测试屏幕触点,如何检测Android Studio中的后台服务是否触摸了屏幕?
  5. maxlength不起作用android,Android EditText设置Filter以后(xml布局文件中maxLength不起作用的解决办法)...
  6. BWA MEM比对人类参考基因组详解
  7. 洛谷P2255 [USACO14JAN]记录奥林比克Recording the M…
  8. 清理 Docker 占用磁盘空间
  9. 应届生小白如何找一份靠谱工作
  10. 惠普c7000服务器装系统,C7000刀片系统安装实施方案.docx