您的位置:首页 > 其它

分酒问题——三个酒杯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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐