Puntuación alta: Problema de separación de aceite, ¿cómo programar en C++?
#include?
#include?
int?vol1,vol2,vol3,cur1,cur2,cur3 ,bandera=0,objetivo,bordillo1,bordillo2,bordillo3;
int?map[100][100][100];
int?x[10000];?// Registre la operación de vertido de aceite en cada paso. 1 a 2 se representa como 1, 1 a 3 se representa como 2, 2 a 1 se representa como 3, 2 a 3 se representa como 4, 3 a 1 se representa como 5, 3. a 2 se representa como 6?
void?push(int?*t1,?int?*t2,int?v2)?//Considere ?*t1 y *t2 como el volumen de petróleo actual, y v2 como la capacidad del contenedor donde se encuentra *t2.
?
{if(?v2>*t1+*t2){*t2=*t2+*t1;*t1=0;} ¿más?{?*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 {?case?1:? push (&curb1,&curb2,vol2); printf("%d?%d?%d\n",curb1,curb2,curb3); caso de ruptura?2: ? push(&curb1,&curb3,vol3); printf("%d?%d?%d\n",curb1,curb2,curb3); romper; caso?3:? push(&curb2,&curb1,vol1); printf("%d?%d?%d\n",curb1, curb2,curb3); romper caso?4:? push(&curb2,&curb3,vol3); printf("%d?%d ?%d\n",curb1,curb2,curb3); romper; caso?5:? push(&curb3,&curb1,vol1); printf("%d?%d?%d\n",curb1,curb2,curb3); romper caso?6:? push(&curb3,&curb2, vol2); printf("%d?%d?%d\n",curb1,curb2,curb3); romper } } void?backtrack(int?step) {?int?t1=cur1,t2=cur2,t3=cur3;? if(bandera)?return; if(?t1==objetivo||t2==objetivo||t3==objetivo) {?print(paso) ;flag=1;return;?} //¿Empezar a intentar pasar del 1 al 2? push(&cur1,&cur2,vol2); if(!map[cur1] [cur2 ][cur3]) {x[step]=1;map[cur1][cur2][cur3]=1; retroceder(paso+1);? } cur1=t1;cur2=t2;cur3=t3; //Finalizar el vertido de 1 a 2 y restaurar el volumen de aceite original de cada recipiente //¿Empezar a intentarlo? verter del 1 al 3? push(&cur1,&cur3,vol3); if(!map[cur1][cur2][cur3]) {?x[step]= 2;map[cur1] [cur2][cur3]=1; retroceder(paso+1);? } cur1=t1;cur2=t2;cur3=t3; //fin 1 3. ¿Restaurar el volumen de aceite original de cada recipiente? //¿Empezar a intentar verter 2 a 1? push(& amp;cur2,&cur1,vol1); if(!map[cur1][cur2][cur3]) {x[step]=3;map[cur1][ cur2][cur3]=1; retroceder(paso+1);? } cur1=t1;cur2=t2;cur3=t3; restaurar el volumen de aceite original de cada recipiente // Comience a intentar verter de 2 a 3 push(&cur2,&cur3,vol3); if(!map[cur1][cur2] [ cur3]) {x[step]=4;map[cur1][cur2][cur3]=1; retroceder(paso+1);? } p > cur1=t1;cur2=t2;cur3=t3; //Finalizar 2 a 3, restaurar el volumen de aceite original de cada contenedor //¿Empezar a probar 3 a 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; //Finalizar 3 a 1, restaurar cada uno; El volumen de aceite original del recipiente // ¿Comenzar a intentar verter de 3 a 2? push(&cur3,&cur2,vol2); if(!map[cur1][cur2 ][cur3] ) {x[step]=6;map[cur1][cur2][cur3]=1; retroceder(paso+1);? } cur1=t1;cur2=t2;cur3=t3; //Termina 3 y vierte en 2, restaurando el volumen de aceite original de cada recipiente } int?main() {scanf("%d%d%d%d%d%d%d",&vol1,&vol2,&vol3,&cur1,&cur2,&cur3,&memset(mapa); ,0,sizeof(map )); map[cur1][cur2][cur3]=1; curb1=cur1;curb2=cur2;curb3=cur3; flag) printf("imposible "); } Entrada: 3 líneas La primera línea son 3 números enteros, desde de grande a pequeño, indica capacidad de 3 contenedores La primera línea es 3 enteros, indica el volumen de aceite original de los 3 contenedores La tercera línea es 1 entero, indica la cantidad requerida de aceite (Puedes conseguirlo en cualquier contenedor) Salida: Cada estado durante el proceso de implementación (es decir, la cantidad de aceite en cada contenedor). No hay una respuesta única. Si no es posible, genera: "imposible".