永发信息网

c语言程序设计:分酒问题某人有12品脱的酒一瓶,想从中倒出6品脱,下面是代码找个大侠改下,最好重写下

答案:1  悬赏:0  手机版
解决时间 2021-03-02 04:28
#include <iostream>
using namespace std;

int V[3]={12,8,5};
int src[6] ={0,0,1,1,2,2};
int dest[6]={1,2,0,2,0,1};
int record[100][3];
int rec_index=0;

void Pour(int state[],int a,int b)
{
int r=V[b]-state[b];
if(state[a]<r) {state[b]+=state[a];state[a]=0;}
else {state[b]=V[b];state[a]-=r;}
}

void Output()
{
printf(" A B C\n");
for(int i=0;i<rec_index;++i)
printf("%4d %4d %4d\n",record[i][0],record[i][1],record[i][2]);
printf("\n\n");
}

void Record(int state[])
{
record[rec_index][0]=state[0];
record[rec_index][1]=state[1];
record[rec_index][2]=state[2];
++rec_index;
}

bool Exist(int state[])
{
for(int i=0;i<rec_index;++i)
if (state[0]==record[i][0]
&& state[1]==record[i][1]
&& state[2]==record[i][2])
return true;
return false;
}

void Solve(int state[])
{

int a=state[0],b=state[1],c=state[2];
Record(state);
if(a==6 && b==6 && c==0) {Output();return;}
for(int i=0;i<6;++i)
{
if(state[src[i]]==0) continue;
Pour(state,src[i],dest[i]);
if(!Exist(state))
{
Solve(state);
--rec_index;
}
state[0]=a;state[1]=b;state[2]=c;
}
}

int main()
{
int init[3]={12,0,0};
Solve(init);
return 0;
}
要加上注释
最佳答案
...是我以前回答的

#include <iostream>
using namespace std;

//三个瓶子以0,1,2标识

int V[3]={12,8,5};//三个瓶子的容积

//可能的倒酒方式有6种,从src[i]到dest[i]
int src[6] ={0,0,1,1,2,2};
int dest[6]={1,2,0,2,0,1};

int record[100][3];//record[i][0~2]记录三个瓶子盛酒的状态
int rec_index=0;//已知的状态数

//从a瓶倒酒到b瓶
void Pour(int state[],int a,int b)
{
int r=V[b]-state[b];
if(state[a]<r) {state[b]+=state[a];state[a]=0;}
else {state[b]=V[b];state[a]-=r;}
}

//输出倒酒的全部步骤
void Output()
{
printf(" A B C\n");
for(int i=0;i<rec_index;++i)
printf("%4d %4d %4d\n",record[i][0],record[i][1],record[i][2]);
printf("\n\n");
}

//记录倒酒的步骤
void Record(int state[])
{
record[rec_index][0]=state[0];
record[rec_index][1]=state[1];
record[rec_index][2]=state[2];
++rec_index;
}

//状态是否出现过
bool Exist(int state[])
{
for(int i=0;i<rec_index;++i)
if (state[0]==record[i][0]
&& state[1]==record[i][1]
&& state[2]==record[i][2])
return true;
return false;
}

//根据当前状态求解下一状态
void Solve(int state[])
{
int a=state[0],b=state[1],c=state[2];
Record(state);
if(a==6 && b==6 && c==0) {Output();return;} //到达目标,输出
for(int i=0;i<6;++i) //尝试所有可能的操作
{
if(state[src[i]]==0) continue;
Pour(state,src[i],dest[i]);
if(!Exist(state)) //判断重复状态避免进入死循环
{
Solve(state);
--rec_index;
}
state[0]=a;state[1]=b;state[2]=c; //恢复当前状态
}
}

int main()
{
int init[3]={12,0,0};//初始状态
Solve(init);
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
梦幻西游领取了牧场任务搬家后再完成牧场出现
华为笔记本什么价格买合适?现在有点贵了。
为什么美国的单机游戏不要激活码,中国的就要
饱和石灰水加热会出现什么现象
番禺区大岗镇岭东村民委员会地址在哪,我要去
梦到旧同事
请问国外出书出版要注意些什么?
小儿内服使君子,每日的最大用量是A.20粒B.25
那年青春我们正好,好看吗,
皇家圣雪洗衣生活馆万达店地址有知道的么?有
银龙怎么是银灰色不是那种银光闪闪的怎么回事
晒后修复面膜和芦荟胶哪个好
属于儿童行为障碍的有()。
阿富便利店这个地址在什么地方,我要处理点事
没学历没技术没工作没朋友又没收人的人该怎么
推荐资讯
千岛湖森林氧吧,散客如何去(自己没有车)
【照片纸尺寸】十寸照片等于多大纸张
我以后做什么
求微分方程通解 y'+2xy/(1+x^2)=x/(1+x^
宝鸡名片设计、宝鸡宣传页设计印刷、商标设计
玩lol是用24寸的显示器好啊 还是23寸的好
关于伶俐的词语
中餐和西餐,哪个工资高好就业
【微克与毫克】您好,急求微克/克和毫克/千克
甲、乙、丙三人沿湖边散步甲按顺时针方向行走
有没有用千珏打ADC的
海淀驾校科目四要预约么?预约大概多久
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?