#include?<string.h>
int?vol1,vol2,vol3,cur1,cur2,cur3,flag=0,goal,curb1,curb2,curb3;
int?map[100][100][100];
int?x[10000];?//記錄每壹步的倒油操作,1到2表示為1,1到3表示為2,2到1表示為3,2到3表示為4,3到1表示為5,3到2表示為6?
void?push(int?*t1,?int?*t2,int?v2)?//把?*t1和*t2為當前油量,v2為*t2所在容器的容量。?
{if(?v2>*t1+*t2){*t2=*t2+*t1;*t1=0;}
else?{?*t2=*t2+*t1;*t1=*t2-v2;*t2=v2;}}
void?print(int?step)
{printf("%d?%d?%d\n",curb1,curb2,curb3);
for(int?i=1;?i<step;i++) switch(x[i]){?case?1:?
push(&curb1,&curb2,vol2);printf("%d?%d?%d\n",curb1,curb2,curb3);
break;
case?2:?push(&curb1,&curb3,vol3);
printf("%d?%d?%d\n",curb1,curb2,curb3);
break;
case?3:?push(&curb2,&curb1,vol1);
printf("%d?%d?%d\n",curb1,curb2,curb3);
break;
case?4:?push(&curb2,&curb3,vol3);
printf("%d?%d?%d\n",curb1,curb2,curb3);
break;
case?5:?push(&curb3,&curb1,vol1);
printf("%d?%d?%d\n",curb1,curb2,curb3);
break;
case?6:?push(&curb3,&curb2,vol2);
printf("%d?%d?%d\n",curb1,curb2,curb3);
break;
}
}
void?backtrack(int?step)
{?int?t1=cur1,t2=cur2,t3=cur3;?
if(flag)?return;
if(?t1==goal||t2==goal||t3==goal)
{?print(step);flag=1;return;?}
//開始嘗試1倒到2?push(&cur1,&cur2,vol2);
if(!map[cur1][cur2][cur3])
{x[step]=1;map[cur1][cur2][cur3]=1;
backtrack(step+1);?}
cur1=t1;cur2=t2;cur3=t3;
//結束1倒到2,恢復各容器的原來油量?
//開始嘗試1倒到3? push(&cur1,&cur3,vol3);if(!map[cur1][cur2][cur3])
{?x[step]=2;map[cur1][cur2][cur3]=1;
backtrack(step+1);?}
cur1=t1;cur2=t2;cur3=t3;
//結束1倒到3,恢復各容器的原來油量? //開始嘗試2倒到1?push(&cur2,&cur1,vol1);
if(!map[cur1][cur2][cur3])
{x[step]=3;map[cur1][cur2][cur3]=1;
backtrack(step+1);?}
cur1=t1;cur2=t2;cur3=t3;
//結束2倒到1,恢復各容器的原來油量 //開始嘗試2倒到3push(&cur2,&cur3,vol3);
if(!map[cur1][cur2][cur3])
{x[step]=4;map[cur1][cur2][cur3]=1;
backtrack(step+1);?}
cur1=t1;cur2=t2;cur3=t3;
//結束2倒到3,恢復各容器的原來油量 //開始嘗試3倒到1?push(&cur3,&cur1,vol1);
if(!map[cur1][cur2][cur3])
{x[step]=5;map[cur1][cur2][cur3]=1;
backtrack(step+1);?}
cur1=t1;cur2=t2;cur3=t3;
//結束3倒到1,恢復各容器的原來油量 //開始嘗試3倒到2?push(&cur3,&cur2,vol2);
if(!map[cur1][cur2][cur3])
{x[step]=6;map[cur1][cur2][cur3]=1;
backtrack(step+1);?}
cur1=t1;cur2=t2;cur3=t3;
//結束3倒到2,恢復各容器的原來油量}
int?main()
{scanf("%d%d%d%d%d%d%d",&vol1,&vol2,&vol3,&cur1,&cur2,&cur3,&goal);
memset(map,0,sizeof(map)); map[cur1][cur2][cur3]=1;curb1=cur1;curb2=cur2;curb3=cur3;
backtrack(1); if(?!flag) printf("impossible");}
輸入:
3行
第1行是3個整數,由大到小,表示3個容器的容量
第1行是3個整數,表示3個容器的原有油量
第3行是1個整數,表示要求得到的油量(放在哪個容器裏得到都可以)
輸出:
實現過程中的各個狀態(即各個容器的油量)。答案不唯壹。
如果沒有可能實現,則輸出:“impossible”。