int i
void getti(int a,int y,int z)
int main()
{
int a,y,z
printf("input full a, empty b,c,get i:")
scanf("%d%d%d%d"祥卜,&a,&y,&z,&i)
getti(a,y,z)
getti(a,y,z)
return 0
}
void getti(int a,int y,int z)
{
int 哗宴银b=0,c=0
printf("a%d b%d c%d\n%4d%4d%4d\n",a,y,z,a,b,c)
while(a!=i||(b!=i&乱宴&c!=i)) {
if(!b)
{ a-=yb=y }
else if(c==z)
{ a+=zc=0 }
else if(b>z-c)
{
b-=(z-c)c=z
}
else { c+=bb=0 }
printf("%4d%4d%4d\n",a,b,c)
}
}
5-->83 0 53-->指余亩50 3 5
8-->33 3 2
3-->毁大51 5 2
5-->81 0 7
3-->50 1 7
8-->唯森33 1 4
5-->34 0 4
...是我以前回答的#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("ABC\n")
for(int i=0i<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=0i<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=0i<6++i) //尝试所有可能的 *** 作
{
if(state[src[i]]==0) continue
Pour(state,src[i],dest[i])
if(!Exist(state)) //判断重复状态避免进入死循环
{
Solve(state)
--rec_index
}
state[0]=astate[1]=bstate[2]=c//恢复当迹丛散前状态
}
}
int main()
{
int init[3]={12,0,0}//初始状态
Solve(init)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)