分酒问题

百燕之家 / 信息详情

c语言程序设计:分酒问题某人有12品脱的酒一瓶,想从中倒出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 "); for(int i=0;i<rec_index;++i) printf("%4d %4d %4d ",record[i][0],record[i][1],record[i][2]); printf(" ");}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;}

经典分酒问题

先找两个容器一只里面倒三斤,让其中的两人先喝了,这样,其中的一瓶酒就只有两斤了,再倒入三斤的瓶里面,看看有多高,划个线,这样三斤的瓶子就成了带刻度的了,能分出三斤和二斤的了,然后再倒满.倒满后还是三斤,再向先倒过三斤的两个容器里倒到划线的部分就是一斤,这样两次后,先倒的就成了四斤了.后面的就好办了,比着先倒的高度也行,让三斤的瓶子倒到两斤,两次不就是四斤了吗,