c语言中平分怎么表示,平分水问题
/**
一个队列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语言中平分怎么表示,平分水问题相关推荐
- C 语言中的内存分析
C 语言中的内存分析 一.进制 我们需要了解的4中进制:二进制.八进制.十进制.十六进制 #include <stdio.h> int main() { //默认情况下是十进制 intnu ...
- C语言程序顺序结构1交换变量,如何将c语言中结构体内的所有类型变量的值输出来...
教了多年<C程序设计>课程,大多学生觉的这门课程难学.其实,按照我们现在的教学大纲和教学要求,只要同学们掌握一些方法,克服心理上畏难.不轻言放弃,是完全可以学好的. <C 程序设计& ...
- C语言中的文件是什么?
我们对文件的概念已经非常熟悉了,比如常见的 Word 文档.txt 文件.源文件等.文件是数据源的一种,最主要的作用是保存数据. 在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被 ...
- r语言c5.0要求因子输出,R语言中因子的创建与使用
原标题:R语言中因子的创建与使用 因子在R语言中可以用来表示名义型变量或有序变量.名义变量一般表示类别,如性别,种族等等.有序变量是有一定排序顺序的变量,如职称,年级等等.在R语言中,名义变量和有序变 ...
- eof在c语言中表示什么_日语中的鍵为什么既能表示“钥匙”也能表示“锁”?...
我们知道,日语中的「鍵(かぎ)」表示"钥匙"的意思,例如:(1)玄関(げんかん)の鍵をなくした.房门钥匙弄丢了.但同时还能表示"锁"的意思.例如:(2)納戸(な ...
- c语言中声明外部函数需要添加的关键字,C语言中声明和定义的区别——分析extern关键词。...
一直很迷惑C语言中的声明和定义的有些实践中的用法,说迷惑实践是因为声明和定义的概念上的区别是很明确的. 定义和声明的区别(主要针对变量): 定义是要为变量分配存储空间,还可以在定义的时候为变量指定初始 ...
- python文件定位函数_C语言中文件定位函数总结
C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...
- c语言如何将变量设为0,C语言中的全局变量如果没有指定初值,则其初值自动设置为0。...
下井.语言中坑空间孔门工作打开的廊道..地.洞的人常闭有限进行隧道室等时,悬挂栏上在遮还应红灯夜间. 全定初脱钩吊钩的(防止上应设置. 安全向参作业作的前应全体底人员加工进行.局变技术交,物件搬运重大 ...
- JAVA语言中数字、字符和字符串处理
前言: JAVA语言中针对数字.数学运算.字符.字符串有专门的类,分别是Number.Math.Character和String. 1.数字: JAVA对数字处理的相关方法被封装在java.lang包 ...
- c语言数组的存储与越界,C语言中的数组越界问题解决方法
1.数组越界,是指访问了超出数组定义的内容. 实例: int a[2]; 数组a定义了2个元素! a[0],a[1]:没有越界. a[2]:越界了! 对不对? 2.计算机全部的内存,其地址是从小到大 ...
最新文章
- python crawler(2)
- 编程之美-求数组中最长递增子序列(LIS)方法整理
- 批处理文件将多台连接的手机安装同一个APP
- kafka中topic默认属性_分享:Kafka 的 Lag 计算误区及正确实现
- aix查看oracle数据库端口号,通过netstat+rmsock查找AIX端口对应进程
- 信息学奥赛一本通 1381:城市路(Dijkstra)
- 几何畸变图像恢复 openCV3 - 数字图像处理作业3
- 在android 两个类之间 get,set方法传参使用
- python基础之列表、元组和字典
- c#获取软件版本、windows用户名、windows用户目录、.net版本、windows版本等
- cd linux安装到u盘,安装 CDLinux 到移动硬盘或U盘
- 遭遇Excel的宏病毒
- php自动播放mp3,html5实现背景音乐的自动播放
- 转一篇千与千寻的影评。。。
- Python 3.x 安装 web.py ,血泪!!
- NODE_多文件上传
- 基于wiki中文语料库的gensim模型使用方法以及R语言的调用方式
- ASP.NET程序设计教程(C#版)——学习心得
- python提升篇(五) -----实例练习第04day
- 大话西游手游服务器维护要多久,大话西游手游:每周必看 2020年6月11日维护公告...
热门文章
- mongodb执行sql脚本文件
- python如何安装pdfminer_Python3.8安装pdfminer
- logisim数据选择器_基于Logisim的CRC编码电路实现.pdf
- 杰控连接mysql_杰控FameView在数据库连接和查询方面的应用
- 中石油企业微信私有版设置服务器,企业微信授权配置教程
- java流程图表示输入 输出_流程图 - 迷途行者 - 博客园
- 交易者的量化程序化交易之路
- Altair Inspire Extrude 2021.1.0 Build 6936 x64
- 51单片机循迹小车c语言程序,51单片机循迹小车源程序
- 在机关事业单位工作年满五十岁,工龄三十年提前退休好还是继续工作好?