求大神分析这个程序的原理
题目:某人有12品脱的酒一瓶,想从中倒出6品脱,但他没有6品脱的容器,仅有一个8品脱和5品脱的容器,设计一个程序输出每一步的分法将啤酒分为两个6品脱。
代码 求大神分析
#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;
}