當前位置:編程學習大全網 - 編程語言 - 高分:分油問題,c++怎麽編程?

高分:分油問題,c++怎麽編程?

#include?<stdio.h>

#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倒到3

push(&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”。

  • 上一篇:像素詳細資料大全
  • 下一篇:如何使用 MessageWebSocket 進行連接
  • copyright 2024編程學習大全網