#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;
}
要加上注释
c语言程序设计:分酒问题某人有12品脱的酒一瓶,想从中倒出6品脱,下面是代码找个大侠改下,最好重写下
答案:1 悬赏:0 手机版
解决时间 2021-03-02 04:28
- 提问者网友:活着好累
- 2021-03-01 15:11
最佳答案
- 五星知识达人网友:等灯
- 2021-03-01 15:24
...是我以前回答的
#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;
}
#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;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯