分酒问题——三个酒杯A B C分别可装8升、5升、3升酒,开始B C装满了酒,在没有其它工具的情况下,将酒平分
2009-12-23 18:06
1191 查看
#include<iostream>
#define MAX 14567898
using namespace std;
int spirit[3];
int v[10][10][10],k;
int From[MAX],To[MAX],Volume[MAX];
int pour(int i,int j)
{
int can;
if(i==j) return 0;
if(spirit[i]<=0) return 0;
if(i==0)
{
if(j==1)
{
can=5-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
else if(j==2)
{
can=3-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
}
else if(i==1)
{
if(j==0)
{
can=8-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
else if(j==2)
{
can=3-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
}
if(i==2)
{
if(j==0)
{
can=8-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
else if(j==1)
{
can=5-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
}
}
void move(int i,int j,int can)//从i倒can升酒到j
{
spirit[i]-=can;
spirit[j]+=can;
}
bool whetherStop()//判断是否已经分好了
{
if(spirit[0]==4&&spirit[1]==4&&spirit[2]==0)
return true;
else return false;
}
void dfs()
{
int i,j,can;
if(whetherStop())
{
cout<<endl;
cout<<"YES,We Success!!!"<<endl<<endl;
for(int m=0;m<k;m++)
printf("从第%d杯子倒入到 ---->第%d杯子: 倒入%d升酒/n",From[m],To[m],Volume[m]);
return;
}
else
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if(i!=j)
{
can=pour(i,j);
if(can>0&&v[spirit[0]][spirit[1]][spirit[2]]==0)
{
v[spirit[0]][spirit[1]][spirit[2]]=1;
int Eight=spirit[0];
int Five=spirit[1];
int Three=spirit[2];
move(i,j,can);
From[k]=i+1;To[k]=j+1;Volume[k++]=can;
dfs();
k--;
v[Eight][Five][Three]=0;
move(j,i,can);
}
}
}
}
}
int main()
{
spirit[0]=0;//eight
spirit[1]=5;//five
spirit[2]=3;//three
k=0;
memset(v,0,sizeof(v));
dfs();
return 7;
}
#define MAX 14567898
using namespace std;
int spirit[3];
int v[10][10][10],k;
int From[MAX],To[MAX],Volume[MAX];
int pour(int i,int j)
{
int can;
if(i==j) return 0;
if(spirit[i]<=0) return 0;
if(i==0)
{
if(j==1)
{
can=5-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
else if(j==2)
{
can=3-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
}
else if(i==1)
{
if(j==0)
{
can=8-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
else if(j==2)
{
can=3-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
}
if(i==2)
{
if(j==0)
{
can=8-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
else if(j==1)
{
can=5-spirit[j];
if(spirit[i]<can)
return spirit[i];
else
return can;
}
}
}
void move(int i,int j,int can)//从i倒can升酒到j
{
spirit[i]-=can;
spirit[j]+=can;
}
bool whetherStop()//判断是否已经分好了
{
if(spirit[0]==4&&spirit[1]==4&&spirit[2]==0)
return true;
else return false;
}
void dfs()
{
int i,j,can;
if(whetherStop())
{
cout<<endl;
cout<<"YES,We Success!!!"<<endl<<endl;
for(int m=0;m<k;m++)
printf("从第%d杯子倒入到 ---->第%d杯子: 倒入%d升酒/n",From[m],To[m],Volume[m]);
return;
}
else
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if(i!=j)
{
can=pour(i,j);
if(can>0&&v[spirit[0]][spirit[1]][spirit[2]]==0)
{
v[spirit[0]][spirit[1]][spirit[2]]=1;
int Eight=spirit[0];
int Five=spirit[1];
int Three=spirit[2];
move(i,j,can);
From[k]=i+1;To[k]=j+1;Volume[k++]=can;
dfs();
k--;
v[Eight][Five][Three]=0;
move(j,i,can);
}
}
}
}
}
int main()
{
spirit[0]=0;//eight
spirit[1]=5;//five
spirit[2]=3;//three
k=0;
memset(v,0,sizeof(v));
dfs();
return 7;
}
相关文章推荐
- 6.M设想有三个碗。A碗(8升容量)里有5升水。B碗(5升容量)里有3升水。C碗(3升容量)里有2升水。 你能只倒两次而准确地量出1升水吗?
- 有三个桶,两个大的可装8斤的水,一个小的可装3斤的水,现在有16斤水装满了两大桶就是8斤的桶,小桶空着,如何把这16斤水分给4个人,每人4斤。没有其他任何工具,4人自备容器,分出去的水不可再要回来。
- 现在没有可用的软件包 *** ,但是它被其它的软件包引用了 和 E: 无法定位软件包 ***问题解决(思路清晰干货)
- sqlserver中多行所有数据重复,无法更新或删除问题,通常是在没有主键的情况下的表
- java书写规范问题,for、while、do while{}后面不能直接定义变量或生成对象(在没有大括号的情况下)
- 如何在没有外网的情况下,通过Centos系统光盘创建yum源,结果rpm包依赖性问题
- 企业仓库管理软件免费版要把处理好三个问题 利用凌云仓库管理软件免费版的智能补货功能可以快速的指定采购策略,这里面就需要及时了解每一张采购订单的执行情况,不但要防止遗漏订单情况的发生,更要防止情绪化采购
- 在没有任何工具的情况下,如何将一个正方形七等分
- [61] 测试技术常见的十一种问题之九:没有产品说明书和需求文档地情况下能够进行黑盒测试吗?
- QT中LineEdit TextEdit PlainTextEdit 这三个控件有什么区别,分别用在什么情况下呢
- 一个用VC生成DLL并用于其它工具的问题
- LoadRunner开始录制时启动浏览器卡死的解决办法 + 其它常见问题
- AutoIt:工具栏中没有其它工具,eg,Koda
- 已知有三个容量分别为3千克、5千克和8千克的并且是没有刻度的酒瓶
- 3.你有三个碗:分别是7,4,3升容量。只有7升那个是满的。用最少次数倒出分别是2,2,和3升水。
- 解决Struts2中CKFinder上传图片等文件后没有响应(服务器上也没有)问题--某特殊情况
- easyui combobox可编辑的情况下,只能首字母开始过滤的问题选项
- override equals后也要override hashcode方法,否则hashmap,hashset,hashtable这三个集合中的操作会出问题。 (其他情况下,不重写hashcode没)
- 如何在Windows Server 2008 R2没有磁盘清理工具的情况下使用系统提供的磁盘清理工具
- 请分别输入年月日三个数值,计算出这是这一年的第几天?(提示:要考虑闰年和2月的情况)