#include <stdio.h>
typedef struct
{
int canibales; // Numero de canibales en el barco
int misioneros; // Numero de misioneros en el barco
int ida; // A true si el barco hace el recorrido de ida, 0 en el caso de vuelta
} Barco;
typedef struct
{
int canibales; // Numero de canibales en el barco
int misioneros; // Numero de misioneros en el barco
} Posicion;
void MoverAlBarco(Posicion * isla, Barco const* barco)
{
isla->canibales -= barco->canibales;
isla->misioneros -= barco->misioneros;
}
void MoverALaIsla(Posicion * isla, Barco const* barco)
{
isla->canibales += barco->canibales;
isla->misioneros += barco->misioneros;
}
void imprimirIsla(Posicion const* posicion)
{
printf("M:%d C:%d", posicion
->misioneros
, posicion
->canibales
); }
void imprimirBarco(Barco const* barco)
{
if( barco->ida )
{
printf("---->> \\_M:%d_C:%d_/ ", barco
->misioneros
, barco
->canibales
); }
else
{
printf(" \\_M:%d_C:%d_/ <<----", barco
->misioneros
, barco
->canibales
); }
}
int viajeValido(Posicion const* origen, Posicion const* destino, Barco const* barco)
{
int toReturn = (origen->misioneros - barco->misioneros >= 0)
&& (origen->canibales - barco->canibales >= 0);
if( toReturn && origen->misioneros - barco->misioneros != 0 )
toReturn = (origen->canibales - barco->canibales <= origen->misioneros - barco->misioneros);
if( toReturn && destino->misioneros + barco->misioneros != 0 )
toReturn = (destino->canibales + barco->canibales <= destino->misioneros + barco->misioneros);
return toReturn;
}
void imprimirEstado(Posicion const* inicio, Posicion const* fin, Barco const* barco)
{
imprimirIsla(inicio);
imprimirBarco(barco);
imprimirIsla(fin);
}
int main()
{
Posicion inicio = { 3, 3 };
Posicion fin = { 0, 0 };
Barco const ida[] = { { 2, 0, 1 }, { 0, 2, 1 }, { 1, 1, 1 } };
Barco const vuelta[] = { { 1, 0, 0 }, { 1, 1, 0 } };
Barco const dummy = {0, 0, 1};
imprimirEstado(&inicio, &fin, &dummy);
while(1)
{
for( int i=0; i<3; i++ )
{
Barco const* barco = &ida[i];
if( viajeValido(&inicio, &fin, barco) )
{
MoverAlBarco(&inicio, barco);
imprimirEstado(&inicio, &fin, barco);
MoverALaIsla(&fin, barco);
break;
}
}
if( fin.canibales == 3 && fin.misioneros == 3 )
{
imprimirEstado(&inicio, &fin, &dummy);
break;
}
for( int i=0; i<2; i++ )
{
Barco const* barco = &vuelta[i];
if( viajeValido(&fin, &inicio, barco) )
{
MoverAlBarco(&fin, barco);
imprimirEstado(&inicio, &fin, barco);
MoverALaIsla(&inicio, barco);
break;
}
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBpbnQgY2FuaWJhbGVzOyAgLy8gTnVtZXJvIGRlIGNhbmliYWxlcyBlbiBlbCBiYXJjbwogICAgaW50IG1pc2lvbmVyb3M7IC8vIE51bWVybyBkZSBtaXNpb25lcm9zIGVuIGVsIGJhcmNvCiAgICBpbnQgaWRhOyAgICAgICAgLy8gQSB0cnVlIHNpIGVsIGJhcmNvIGhhY2UgZWwgcmVjb3JyaWRvIGRlIGlkYSwgMCBlbiBlbCBjYXNvIGRlIHZ1ZWx0YQp9IEJhcmNvOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgaW50IGNhbmliYWxlczsgIC8vIE51bWVybyBkZSBjYW5pYmFsZXMgZW4gZWwgYmFyY28KICAgIGludCBtaXNpb25lcm9zOyAvLyBOdW1lcm8gZGUgbWlzaW9uZXJvcyBlbiBlbCBiYXJjbwp9IFBvc2ljaW9uOwoKdm9pZCBNb3ZlckFsQmFyY28oUG9zaWNpb24gKiBpc2xhLCBCYXJjbyBjb25zdCogYmFyY28pCnsKICAgIGlzbGEtPmNhbmliYWxlcyAtPSBiYXJjby0+Y2FuaWJhbGVzOwogICAgaXNsYS0+bWlzaW9uZXJvcyAtPSBiYXJjby0+bWlzaW9uZXJvczsKfQoKdm9pZCBNb3ZlckFMYUlzbGEoUG9zaWNpb24gKiBpc2xhLCBCYXJjbyBjb25zdCogYmFyY28pCnsKICAgIGlzbGEtPmNhbmliYWxlcyArPSBiYXJjby0+Y2FuaWJhbGVzOwogICAgaXNsYS0+bWlzaW9uZXJvcyArPSBiYXJjby0+bWlzaW9uZXJvczsKfQoKdm9pZCBpbXByaW1pcklzbGEoUG9zaWNpb24gY29uc3QqIHBvc2ljaW9uKQp7CiAgICBwcmludGYoIk06JWQgQzolZCIsIHBvc2ljaW9uLT5taXNpb25lcm9zLCBwb3NpY2lvbi0+Y2FuaWJhbGVzKTsKfQoKdm9pZCBpbXByaW1pckJhcmNvKEJhcmNvIGNvbnN0KiBiYXJjbykKewogICAgaWYoIGJhcmNvLT5pZGEgKQogICAgewogICAgICAgIHByaW50ZigiLS0tLT4+IFxcX006JWRfQzolZF8vICAgICAgICIsIGJhcmNvLT5taXNpb25lcm9zLCBiYXJjby0+Y2FuaWJhbGVzKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwcmludGYoIiAgICAgICBcXF9NOiVkX0M6JWRfLyA8PC0tLS0iLCBiYXJjby0+bWlzaW9uZXJvcywgYmFyY28tPmNhbmliYWxlcyk7CiAgICB9Cn0KCmludCB2aWFqZVZhbGlkbyhQb3NpY2lvbiBjb25zdCogb3JpZ2VuLCBQb3NpY2lvbiBjb25zdCogZGVzdGlubywgQmFyY28gY29uc3QqIGJhcmNvKQp7CiAgICBpbnQgdG9SZXR1cm4gPSAob3JpZ2VuLT5taXNpb25lcm9zIC0gYmFyY28tPm1pc2lvbmVyb3MgPj0gMCkKICAgICAgICAgICAgICAgICAmJiAob3JpZ2VuLT5jYW5pYmFsZXMgLSBiYXJjby0+Y2FuaWJhbGVzID49IDApOwogICAgCiAgICBpZiggdG9SZXR1cm4gJiYgb3JpZ2VuLT5taXNpb25lcm9zIC0gYmFyY28tPm1pc2lvbmVyb3MgIT0gMCApCiAgICAgICAgdG9SZXR1cm4gPSAob3JpZ2VuLT5jYW5pYmFsZXMgLSBiYXJjby0+Y2FuaWJhbGVzIDw9IG9yaWdlbi0+bWlzaW9uZXJvcyAtIGJhcmNvLT5taXNpb25lcm9zKTsKICAgIGlmKCB0b1JldHVybiAmJiBkZXN0aW5vLT5taXNpb25lcm9zICsgYmFyY28tPm1pc2lvbmVyb3MgIT0gMCApCiAgICAgICAgdG9SZXR1cm4gPSAoZGVzdGluby0+Y2FuaWJhbGVzICsgYmFyY28tPmNhbmliYWxlcyA8PSBkZXN0aW5vLT5taXNpb25lcm9zICsgYmFyY28tPm1pc2lvbmVyb3MpOwogICAgCiAgICByZXR1cm4gdG9SZXR1cm47Cn0KCnZvaWQgaW1wcmltaXJFc3RhZG8oUG9zaWNpb24gY29uc3QqIGluaWNpbywgUG9zaWNpb24gY29uc3QqIGZpbiwgQmFyY28gY29uc3QqIGJhcmNvKQp7CiAgICBpbXByaW1pcklzbGEoaW5pY2lvKTsKICAgIHByaW50ZigiIHwgIik7CiAgICBpbXByaW1pckJhcmNvKGJhcmNvKTsKICAgIHByaW50ZigiIHwgIik7CiAgICBpbXByaW1pcklzbGEoZmluKTsKICAgIHByaW50ZigiXG4iKTsKfQoKCmludCBtYWluKCkKewogICAgUG9zaWNpb24gaW5pY2lvID0geyAzLCAzIH07CiAgICBQb3NpY2lvbiBmaW4gPSB7IDAsIDAgfTsKCiAgICBCYXJjbyBjb25zdCBpZGFbXSA9IHsgeyAyLCAwLCAxIH0sIHsgMCwgMiwgMSB9LCB7IDEsIDEsIDEgfSB9OwogICAgQmFyY28gY29uc3QgdnVlbHRhW10gPSB7IHsgMSwgMCwgMCB9LCB7IDEsIDEsIDAgfSB9OwoJQmFyY28gY29uc3QgZHVtbXkgPSB7MCwgMCwgMX07CgogICAgaW1wcmltaXJFc3RhZG8oJmluaWNpbywgJmZpbiwgJmR1bW15KTsKICAgIHdoaWxlKDEpCiAgICB7CiAgICAgICAgZm9yKCBpbnQgaT0wOyBpPDM7IGkrKyApCiAgICAgICAgewogICAgICAgICAgICBCYXJjbyBjb25zdCogYmFyY28gPSAmaWRhW2ldOwogICAgICAgICAgICBpZiggdmlhamVWYWxpZG8oJmluaWNpbywgJmZpbiwgYmFyY28pICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTW92ZXJBbEJhcmNvKCZpbmljaW8sIGJhcmNvKTsKICAgICAgICAgICAgICAgIGltcHJpbWlyRXN0YWRvKCZpbmljaW8sICZmaW4sIGJhcmNvKTsKICAgICAgICAgICAgICAgIE1vdmVyQUxhSXNsYSgmZmluLCBiYXJjbyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiggZmluLmNhbmliYWxlcyA9PSAzICYmIGZpbi5taXNpb25lcm9zID09IDMgKQogICAgICAgIHsKICAgICAgICAgICAgaW1wcmltaXJFc3RhZG8oJmluaWNpbywgJmZpbiwgJmR1bW15KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvciggaW50IGk9MDsgaTwyOyBpKysgKQogICAgICAgIHsKICAgICAgICAgICAgQmFyY28gY29uc3QqIGJhcmNvID0gJnZ1ZWx0YVtpXTsKICAgICAgICAgICAgaWYoIHZpYWplVmFsaWRvKCZmaW4sICZpbmljaW8sIGJhcmNvKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE1vdmVyQWxCYXJjbygmZmluLCBiYXJjbyk7CiAgICAgICAgICAgICAgICBpbXByaW1pckVzdGFkbygmaW5pY2lvLCAmZmluLCBiYXJjbyk7CiAgICAgICAgICAgICAgICBNb3ZlckFMYUlzbGEoJmluaWNpbywgYmFyY28pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKfQo=