分红酒程序有人能帮我想个思路吗

问题描述

标题:分红酒有4个红酒瓶子,它们的容量分别是:9升,7升,4升,2升开始的状态是[9,0,0,0],也就是说:第一个瓶子满着,其它的都空着。允许把酒从一个瓶子倒入另一个瓶子,但只能把一个瓶子倒满或把一个瓶子倒空,不能有中间状态。这样的一次倒酒动作称为1次操作。假设瓶子的容量和初始状态不变,对于给定的目标状态,至少需要多少次操作才能实现?本题就是要求你编程实现最小操作次数的计算。输入:最终状态(逗号分隔)输出:最小操作次数(如无法实现,则输出-1)例如:输入:9,0,0,0应该输出:0输入:6,0,0,3应该输出:-1输入:7,2,0,0应该输出:2所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意不要使用package语句。不要使用jdk1.6及以上版本的特性。

解决方案

解决方案二:
以前做过一个号称是微软面试题的分酒的题目,就是8,8,3升的三个容器中,两个8L的装满了酒,怎么平均分给四个人。当时的做法就是把酒尽可能的细化,分成尽可能小的部分,来判断是否可以完成。这题应该和那道题差不多吧,但是有点不一样就是怎么最少次数来实现。。这个我感觉应该先是判断是否多小的部分可以完成分酒任务来实现。明天再仔细想想。。
解决方案三:
搜一下蓝桥杯第三届的复试题,Java本科最后一题就是这个
解决方案四:
这题很明显得用BFS来解决,条件的控制什么的就比较麻烦了,仔细想想吧。
解决方案五:
#include<stdio.h>inttemp[4]={9,7,4,2};intmin=200;voidfun(intT[],intt[],inti,intcount){if(T[0]==t[0]&&T[1]==t[1]&&T[2]==t[2]&&T[3]==t[3]){if(count<min)min=count;}elseif(i==4){return;}else{for(intj=i;j<4+i;j++){if(!T[i]){fun(T,t,i+1,count);}else{intout;if(T[(j+1)%4]==temp[(j+1)%4]){continue;}if(T[i]>=temp[(j+1)%4]-T[(j+1)%4]){out=temp[(j+1)%4]-T[(j+1)%4];T[i]=T[i]-(temp[(j+1)%4]-T[(j+1)%4]);T[(j+1)%4]=temp[(j+1)%4];count++;}else{out=T[i];T[(j+1)%4]+=T[i];T[i]=0;count++;}fun(T,t,i+1,count);T[i]+=out;T[(j+1)%4]-=out;count--;}}}}intmain(){intt[4],T[4]={9,0,0,0};scanf("%d,%d,%d,%d",&t[0],&t[1],&t[2],&t[3]);for(inti=0;i<4;i++){if(t[i]>temp[i]){printf("-1n");return0;}}if(t[0]+t[1]+t[2]+t[3]!=9){printf("-1n");return0;}fun(T,t,0,0);printf("%dn",min);return0;}

这是我这个菜鸟写的,但一些测试数据能通过,一些则不能通过,可能少了一些条件,但想了好久还是没能改善,找不到错在哪。
解决方案六:
#include<stdio.h>#include<stdlib.h>typedefstructNode{inta,b,c,d;structNode*next;}*State;StateA[15];structNodetempS[1000];structNodenewState(inta,intb,intc,intd){structNodestate;state.a=a;state.b=b;state.c=c;state.d=d;state.next=NULL;returnstate;}voidinsertState(Statehead,Statestate){state->next=head->next;head->next=state;}intdiscover(inta,intb,intc,intd,intcnt){intcount;structNode*s=NULL;for(count=0;count<=cnt;count++)for(s=A[count]->next;s!=NULL;s=s->next)if(s->a==a&&s->b==b&&s->c==c&&s->d==d)returncnt;return-1;}voiditerative()//迭代{intcount;inta,b,c,d;int_a,_b,_c,_d;inti=0;structNode*s=NULL;for(count=0;count<10;count++)for(s=A[count]->next;s!=NULL;s=s->next){a=s->a;b=s->b;c=s->c;d=s->d;if(a!=0){if(b<7){if(a+b>=7){_b=7;_a=a+b-7;_c=c;_d=d;}else{_a=0;_b=a+b;_c=c;_d=d;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}if(c<4){if(a+c>=4){_a=a+c-4;_b=b;_c=4;_d=d;}else{_a=0;_b=b;_c=a+c;_d=d;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}if(d<2){if(a+d>=2){_a=a+d-2;_b=b;_c=c;_d=2;}else{_a=0;_b=b;_c=c;_d=a+d;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}}if(b!=0){if(a<9){if(a+b>=9){_a=9;_b=a+b-9;_c=c;_d=d;}else{_a=a+b;_b=0;_c=c;_d=d;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}if(c<4){if(b+c>=4){_a=a;_b=b+c-4;_c=4;_d=d;}else{_a=a;_b=0;_c=b+c;_d=d;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}if(d<2){if(b+d>=2){_a=a;_b=b+d-2;_c=c;_d=2;}else{_a=a;_b=0;_c=c;_d=b+d;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}}if(c!=0){if(a<9){if(a+c>=9){_b=b;_a=9;_c=a+c-9;_d=d;}else{_a=a+c;_b=b;_c=0;_d=d;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}if(b<7){if(b+c>=7){_a=a;_b=7;_c=b+c-7;_d=d;}else{_a=a;_b=b+c;_c=0;_d=d;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}if(d<2){if(b+d>=2){_a=a;_b=b;_c=c+d-2;_d=2;}else{_a=a;_b=b;_c=0;_d=c+d;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}}if(d!=0){if(a<9){if(a+b>=9){_b=b;_a=9;_c=c;_d=a+d-9;}else{_a=a+d;_b=b;_c=c;_d=0;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}if(c<4){if(d+c>=4){_a=a;_b=b;_c=4;_d=d+c-4;}else{_a=a;_b=b;_c=d+c;_d=0;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}if(b<7){if(b+d>=7){_a=a;_b=7;_c=c;_d=b+d-7;}else{_a=a;_b=b+d;_c=c;_d=0;}if(discover(_a,_b,_c,_d,count)==-1){tempS[i]=newState(_a,_b,_c,_d);insertState(A[count+1],&tempS[i]);i++;}}}}}intsearch(inta,intb,intc,intd){intcount;structNode*s=NULL;for(count=0;count<10;count++)for(s=A[count]->next;s!=NULL;s=s->next)if(s->a==a&&s->b==b&&s->c==c&&s->d==d)returncount;return-1;}intmain(){inta,b,c,d;structNodestart=newState(9,0,0,0);inti;for(i=0;i<15;i++){A[i]=(State)malloc(sizeof(structNode));A[i]->next=NULL;}A[0]->next=&start;iterative();while(scanf("%d%d%d%d",&a,&b,&c,&d)==4){printf("%dn",search(a,b,c,d));}return0;}
解决方案七:
这是我这个菜鸟写的,测试数据都通过了不过方法有点笨用的是迭代
解决方案八:
#include<stdio.h>inttemp[4]={9,7,4,2};intmin=200;voidfun(intT[],intt[],inti,intcount){if(T[0]==t[0]&&T[1]==t[1]&&T[2]==t[2]&&T[3]==t[3]){if(count<min)min=count;}elseif(i==4){return;}else{for(intj=i;j<3+i;j++){if(!T[i]){fun(T,t,i+1,count);}else{intout;if(T[(j+1)%4]==temp[(j+1)%4]){continue;}if(T[i]>=temp[(j+1)%4]-T[(j+1)%4]){out=temp[(j+1)%4]-T[(j+1)%4];T[i]=T[i]-(temp[(j+1)%4]-T[(j+1)%4]);T[(j+1)%4]=temp[(j+1)%4];count++;fun(T,t,i,count);}else{out=T[i];T[(j+1)%4]+=T[i];T[i]=0;count++;fun(T,t,i+1,count);}T[i]+=out;T[(j+1)%4]-=out;count--;//printf("!");}}}}intmain(){intt[4],T[4]={9,0,0,0};scanf("%d,%d,%d,%d",&t[0],&t[1],&t[2],&t[3]);for(inti=0;i<4;i++){if(t[i]>temp[i]){printf("-1n");return0;}}if(t[0]+t[1]+t[2]+t[3]!=9){printf("-1n");return0;}fun(T,t,0,0);printf("%dn",min);return0;}

这是我修改的四楼的代码,应该已经解决了四楼的问题
解决方案九:
引用4楼Sharing_Li的回复:

#include<stdio.h>inttemp[4]={9,7,4,2};intmin=200;voidfun(intT[],intt[],inti,intcount){if(T[0]==t[0]&&T[1]==t[1]&&T[2]==t[2]&&T[3]==t[3]){if(count<min)min=count;}elseif(i==4){return;}else{for(intj=i;j<4+i;j++){if(!T[i]){fun(T,t,i+1,count);}else{intout;if(T[(j+1)%4]==temp[(j+1)%4]){continue;}if(T[i]>=temp[(j+1)%4]-T[(j+1)%4]){out=temp[(j+1)%4]-T[(j+1)%4];T[i]=T[i]-(temp[(j+1)%4]-T[(j+1)%4]);T[(j+1)%4]=temp[(j+1)%4];count++;}else{out=T[i];T[(j+1)%4]+=T[i];T[i]=0;count++;}fun(T,t,i+1,count);T[i]+=out;T[(j+1)%4]-=out;count--;}}}}intmain(){intt[4],T[4]={9,0,0,0};scanf("%d,%d,%d,%d",&t[0],&t[1],&t[2],&t[3]);for(inti=0;i<4;i++){if(t[i]>temp[i]){printf("-1n");return0;}}if(t[0]+t[1]+t[2]+t[3]!=9){printf("-1n");return0;}fun(T,t,0,0);printf("%dn",min);return0;}

这是我这个菜鸟写的,但一些测试数据能通过,一些则不能通过,可能少了一些条件,但想了好久还是没能改善,找不到错在哪。

四楼代码问题出现在:1for循环中j不可为i+3,否则j+1即本身,会出错2:fun(T,t,i+1,count);这个不合适,因为如果没倒空,那么应该还可以继续倒到别的瓶子里,所以应该分条件fun(T,t,i+1,count);和fun(T,t,i,count);
解决方案十:
题目有点意思啊,思考中...
解决方案十一:
想了好久还是不会
解决方案十二:
引用6楼fanhualuojin1992的回复:

这是我这个菜鸟写的,测试数据都通过了不过方法有点笨用的是迭代

为什么我运行的时候用6003最后的结果是5呢
解决方案十三:
引用6楼fanhualuojin1992的回复:

这是我这个菜鸟写的,测试数据都通过了不过方法有点笨用的是迭代

刚刚找到错误了,150行if(c+d>=2){_a=a;_b=b;_c=c+d-2;_d=2;}有个小错误

时间: 2024-10-30 00:27:33

分红酒程序有人能帮我想个思路吗的相关文章

java程序,新手帮我看看,应该很简单。

问题描述 java程序,新手帮我看看,应该很简单. 订单里有5件商品,捡货人员也捡出5件商品,请写算法核对拣货单里的商品,并适当提出出错提示. 解决方案 两个数组比较有几个共同元素?- =:是这样理解嘛 解决方案二: http://www.csdn.net/article/2015-01-15/2823577 看下这个博客 解决方案三: 订单中的5件商品做外循环,拣货员的5件做内循环,判断订单中每件商品是否在拣货员拣出的5件中,若在,则把此商品从订单和拣货的商品列表中移除. 最终,订单中剩余的是

Java初学一枚 一个小程序 求有人帮我看看

问题描述 Java初学一枚 一个小程序 求有人帮我看看 package malnAV; public class Work3_3 { public static void main(String[] args) { //??? //方法 main 不能声明为"静态":只能在静态类型或顶级类型中才能声明静态方法 Emp e1=new Emp(001,"张三"); Emp e2=new Emp(002,"李四"); Emp e3=new Emp(00

csdn问答-在学习java中遇到的一些问题不是很理解,希望有人能帮给我解答一下

问题描述 在学习java中遇到的一些问题不是很理解,希望有人能帮给我解答一下 for循环我知道怎么从1加到9,但是不知道怎么从9减到1,就是说我不会用i--:.还有boolean类型我不是很理解他有什么用,该什么时候用. 还有就是带参方法了,怎么理解 例如: 类: package daican.net; public class aaa { public int name=9; public int pwd=0; int money=10000; public int showqu(int qu

javascript-求帮看想在Html5中实现鼠标点击划线有什么问题

问题描述 求帮看想在Html5中实现鼠标点击划线有什么问题 <!doctype html><html><head><meta charset=""utf-8""><title>划线</title><script language=""javascript"" type=""text/javascript""&g

寻求一高手帮做网站 想赚外快的米我

问题描述 寻求一高手帮做网站想赚外快的米我QQ847321949要求:Myeclipse6.0+tamcat6.0+sqlserver2005SSH框架诚心的来米我http://www.zh4211.net/这个网址就是要重做的网站 解决方案 解决方案二:找我吧解决方案三:师大暨大就在我公司旁边,你这个暨南大学在珠海区?这个网站多少钱呢?预计多少时间要完成?QQ:704662946

c++ 编程问题-这程序输出不是我想要的。我希望在每个随机数中间插入一个换行符

问题描述 这程序输出不是我想要的.我希望在每个随机数中间插入一个换行符 #include #include #include using namespace std; int main() { int num=10; string str,longstr=""; stringstream ss; int *list=new int[num]; std::cout<<"Hello world!"<<std::endl; srand((unsig

eclipse-有没有人能帮我解决MyEclipse破译不成功的问题啊

问题描述 有没有人能帮我解决MyEclipse破译不成功的问题啊 有没有人能帮我解决MyEclipse破译不成功的问题啊,我破译的时候,跟着步骤,到替换文件的时后就是替换不了,这是不是和系统有关啊,还是什么,求大神解释啊

亿米帮要想赢取胜利,时间和空间持续开展才能有效经营

在2013年屡创新高后,亿米帮迎来了新春,13年是忙碌的一年.发展的一年.硕果累累的一年,亿米帮负责人在庆功会上做出相关表示,"一日之计在于晨,一年之计在于春,我们要把握好这个新开始,要针对自身不足及时修正,充分发挥我公司现有技术人才优势,着实稳妥地抓好各部门工作,迎接新挑战." 提到分类信息网站,人们想到的一定是58同城或者赶集网这样的行业领军网站.事实上,分类信息网站目前成了很多想走互联网创业之路的草根创业者的"天堂".在现在这样的信息时代,人们快速准确地获取信

散分!大家有没有好的创意,思路。如果自己创业有没有好的点子

问题描述 散分!大家有没有好的创意,思路.如果自己创业有没有好的点子大家可以发表一下想法,呵呵,为自己也给他人点思路本人希望给广大程序员朋友互相交流的机会 解决方案 解决方案二:想做早期教育..希望朋友们给我一点意见..呵..谢谢..解决方案三:创业?成功的人只有1%,贵在坚持解决方案四:做点自己熟知的业务领域,这样成功机会大一些.解决方案五:我的意见,类似于"开心网"这样的东西,只要有创意,实现不是问题解决方案六:对于手头拮据的程序员来说,开网店是最好选择,省了租金.水电气等.至于卖