/**

一个队列cup[1000]

先让初始化的三个数进入队列。

然后出列一个,这个时候三个杯水量不同,

在这个基础上,按照不同的倒法倒一次水,并让倒后的状态进入队列,

这样不停地倒,直到有一个杯中的水是所有水的一半;或者所有的状态都被存到了队列中,即失败了

*/

#include

using namespace std;

struct Cup //存储倒水过程中的状态

{

public:

Cup():cupa(0),cupb(0),cupc(0),father(-1){}

Cup(int a,int b,int c,int f):cupa(a),cupb(b),cupc(c),father(f){}

int cupa;

int cupb;

int cupc;

int father;

};

class divide

{

public:

divide(int aa,int bb,int cc);

void doDivide();

bool isOver();

bool isContain(const Cup &pp);

void print();

bool atob();//从a倒到b

bool atoc();//从a倒到c

bool btoc();//从b倒到c

bool btoa();//从b倒到a

bool ctob();//从c倒到b

bool ctoa();//从c倒到a

private:

struct Cup p;

int a;

int b;

int c;

Cup cup[1000];

void push(const Cup&p);

int count;

int first;

};

divide::divide(int aa,int bb,int cc):a(aa),b(0),c(0),count(0),first(0)

{

p.cupa = a;

p.cupb = bb;

p.cupc = cc;

p.father= -1;

push(p);

}

void divide::push(const Cup&p)

{

if(count>1000)

{

cout<

return;

}

else

cup[count++] = p;

}

void divide::doDivide()

{

int f =0;

while(first

{

if(first!=0) //表示不是第一次倒水

{

a = cup[first].cupa;

b = cup[first].cupb;

c = cup[first].cupc;

}

if(atob()|atoc()|btoc()|btoa()|ctoa()|ctob())

{

f = 1;

first ++;

}

else

{

f=0;

break;

}

}

if(f==0)

cout<

else

print();

}

bool divide::isOver()

{

if(a==p.cupa/2||b==p.cupa/2||c==p.cupa/2)

return true;

return false;

}

bool divide::isContain(const Cup& pp)

{

for(int i=0;i

{

if(pp.cupa==cup[i].cupa&&pp.cupb==cup[i].cupb&&pp.cupc==cup[i].cupc)

return true;

}

return false;

}

bool divide::atob()

{

int tempa,tempb,tempc;

if(a>0&&b

{

if(a>(p.cupb-b)) //b中容纳不下a中剩余的水

{

tempa = a-(p.cupb-b);

tempb = p.cupb;

tempc = c;

}

else//b能够容纳a中剩余的水

{

tempa = 0;

tempb = b + a;

tempc = c;

}

struct Cup tempp(tempa,tempb,tempc,first);

if(!isContain(tempp)) //如果队列中没有

{

push(tempp);

return true;

}

return false;

}

}

bool divide::atoc()

{

int tempa,tempb,tempc;

if(a>0&&c

{

if(a>(p.cupc-c)) //c中容纳不下a中剩余的水

{

tempa = a-(p.cupc-c);

tempb = b;

tempc = p.cupc;

}

else//c能够容纳a中剩余的水

{

tempa = 0;

tempb = b;

tempc = c + a;

}

struct Cup tempp(tempa,tempb,tempc,first);

if(!isContain(tempp)) //如果队列中没有

{

push(tempp);

return true;

}

return false;

}

}

bool divide::btoc()

{

int tempa,tempb,tempc;

if(b>0&&c

{

if(b>(p.cupc-c)) //c中容纳不下b中剩余的水

{

tempa = a;

tempb = b-(p.cupc-c);

tempc = p.cupc;

}

else//c能够容纳b中剩余的水

{

tempa = a;

tempb = 0;

tempc = c+b;

}

struct Cup tempp(tempa,tempb,tempc,first);

if(!isContain(tempp)) //如果队列中没有

{

push(tempp);

return true;

}

return false;

}

}

bool divide::btoa()

{

int tempa,tempb,tempc;

if(b>0&&a

{

tempa = a+b;

tempb = 0;

tempc = c;

struct Cup tempp(tempa,tempb,tempc,first);

if(!isContain(tempp)) //如果队列中没有

{

push(tempp);

return true;

}

return false;

}

}

bool divide::ctoa()

{

int tempa,tempb,tempc;

if(c>0&&a

{

tempa = a+c;

tempb = b;

tempc = 0;

struct Cup tempp(tempa,tempb,tempc,first);

if(!isContain(tempp)) //如果队列中没有

{

push(tempp);

return true;

}

return false;

}

}

bool divide::ctob()

{

int tempa,tempb,tempc;

if(c>0&&b

{

if(c>(p.cupb-b)) //b中容纳不下c中剩余的水

{

tempa = a;

tempb = p.cupb;

tempc = c-(p.cupb-b);

}

else//b能够容纳c中剩余的水

{

tempa = a;

tempb = b+c;

tempc = 0;

}

struct Cup tempp(tempa,tempb,tempc,first);

if(!isContain(tempp)) //如果队列中没有

{

push(tempp);

return true;

}

return false;

}

}

void divide::print()

{

Cup temp_cup[count];

int temp_count = 0;

int i;

for(i = count-1;cup[i].father!=-1;i=cup[i].father)

temp_cup[temp_count++] = cup[i];

cout<

for(i= temp_count-1;i>=0;i--)

cout<

}

main(void)

{

divide d1(12,7,5),d2(16,9,7),d3(8,5,3),d4(10,6,4);

d1.doDivide();

d2.doDivide();

d3.doDivide();

d4.doDivide();

}

你能学会你想学会的任何东西,这不是你能不能学会的问题,而是你想不想学的问题

c语言中平分怎么表示,平分水问题相关推荐

  1. C 语言中的内存分析

    C 语言中的内存分析 一.进制 我们需要了解的4中进制:二进制.八进制.十进制.十六进制 #include <stdio.h> int main() { //默认情况下是十进制 intnu ...

  2. C语言程序顺序结构1交换变量,如何将c语言中结构体内的所有类型变量的值输出来...

    教了多年<C程序设计>课程,大多学生觉的这门课程难学.其实,按照我们现在的教学大纲和教学要求,只要同学们掌握一些方法,克服心理上畏难.不轻言放弃,是完全可以学好的. <C 程序设计& ...

  3. C语言中的文件是什么?

    我们对文件的概念已经非常熟悉了,比如常见的 Word 文档.txt 文件.源文件等.文件是数据源的一种,最主要的作用是保存数据. 在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被 ...

  4. r语言c5.0要求因子输出,R语言中因子的创建与使用

    原标题:R语言中因子的创建与使用 因子在R语言中可以用来表示名义型变量或有序变量.名义变量一般表示类别,如性别,种族等等.有序变量是有一定排序顺序的变量,如职称,年级等等.在R语言中,名义变量和有序变 ...

  5. eof在c语言中表示什么_日语中的鍵为什么既能表示“钥匙”也能表示“锁”?...

    我们知道,日语中的「鍵(かぎ)」表示"钥匙"的意思,例如:(1)玄関(げんかん)の鍵をなくした.房门钥匙弄丢了.但同时还能表示"锁"的意思.例如:(2)納戸(な ...

  6. c语言中声明外部函数需要添加的关键字,C语言中声明和定义的区别——分析extern关键词。...

    一直很迷惑C语言中的声明和定义的有些实践中的用法,说迷惑实践是因为声明和定义的概念上的区别是很明确的. 定义和声明的区别(主要针对变量): 定义是要为变量分配存储空间,还可以在定义的时候为变量指定初始 ...

  7. python文件定位函数_C语言中文件定位函数总结

    C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...

  8. c语言如何将变量设为0,C语言中的全局变量如果没有指定初值,则其初值自动设置为0。...

    下井.语言中坑空间孔门工作打开的廊道..地.洞的人常闭有限进行隧道室等时,悬挂栏上在遮还应红灯夜间. 全定初脱钩吊钩的(防止上应设置. 安全向参作业作的前应全体底人员加工进行.局变技术交,物件搬运重大 ...

  9. JAVA语言中数字、字符和字符串处理

    前言: JAVA语言中针对数字.数学运算.字符.字符串有专门的类,分别是Number.Math.Character和String. 1.数字: JAVA对数字处理的相关方法被封装在java.lang包 ...

  10. c语言数组的存储与越界,C语言中的数组越界问题解决方法

    1.数组越界,是指访问了超出数组定义的内容. 实例: int  a[2]; 数组a定义了2个元素! a[0],a[1]:没有越界. a[2]:越界了! 对不对? 2.计算机全部的内存,其地址是从小到大 ...

最新文章

  1. python crawler(2)
  2. 编程之美-求数组中最长递增子序列(LIS)方法整理
  3. 批处理文件将多台连接的手机安装同一个APP
  4. kafka中topic默认属性_分享:Kafka 的 Lag 计算误区及正确实现
  5. aix查看oracle数据库端口号,通过netstat+rmsock查找AIX端口对应进程
  6. 信息学奥赛一本通 1381:城市路(Dijkstra)
  7. 几何畸变图像恢复 openCV3 - 数字图像处理作业3
  8. 在android 两个类之间 get,set方法传参使用
  9. python基础之列表、元组和字典
  10. c#获取软件版本、windows用户名、windows用户目录、.net版本、windows版本等
  11. cd linux安装到u盘,安装 CDLinux 到移动硬盘或U盘
  12. 遭遇Excel的宏病毒
  13. php自动播放mp3,html5实现背景音乐的自动播放
  14. 转一篇千与千寻的影评。。。
  15. Python 3.x 安装 web.py ,血泪!!
  16. NODE_多文件上传
  17. 基于wiki中文语料库的gensim模型使用方法以及R语言的调用方式
  18. ASP.NET程序设计教程(C#版)——学习心得
  19. python提升篇(五) -----实例练习第04day
  20. 大话西游手游服务器维护要多久,大话西游手游:每周必看 2020年6月11日维护公告...

热门文章

  1. mongodb执行sql脚本文件
  2. python如何安装pdfminer_Python3.8安装pdfminer
  3. logisim数据选择器_基于Logisim的CRC编码电路实现.pdf
  4. 杰控连接mysql_杰控FameView在数据库连接和查询方面的应用
  5. 中石油企业微信私有版设置服务器,企业微信授权配置教程
  6. java流程图表示输入 输出_流程图 - 迷途行者 - 博客园
  7. 交易者的量化程序化交易之路
  8. Altair Inspire Extrude 2021.1.0 Build 6936 x64
  9. 51单片机循迹小车c语言程序,51单片机循迹小车源程序
  10. 在机关事业单位工作年满五十岁,工龄三十年提前退休好还是继续工作好?