分酒问题的C语言程序

Python013

分酒问题的C语言程序,第1张

5-->83 0 5

3-->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

}

#include<stdio.h>

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)

}

}