Granjero cruzando el río (solución de programación)
Los resultados de la operación son los siguientes:
Llevar la oveja a la otra orilla
Regresar a la orilla de origen con las manos vacías
Trae al lobo a la otra orilla
Trae a la oveja al otro lado
Trae las verduras al otro lado
Vuelve al lado principal vacío- entregado
Trae la oveja al otro lado
Trae la oveja al otro lado
Regresa a la orilla de casa con las manos vacías
Traer verduras a la otra orilla
Traer las ovejas a la orilla de origen
Traer al lobo a la otra orilla
Regresar a la orilla de origen vacío- entregado
Trae la oveja a la otra orilla
Las anteriores son todas las soluciones encontradas ***Hay dos soluciones.
El programa es el siguiente:
#include lt; stdio.hgt
#include lt; #include lt ;string.hgt;
#define MAX_STEP 20
//index: 0 - lobo, 1 - oveja, 2 - vegetal, 3 - granjero, valor: 0 - costa local, 1-Otra costa
int a[MAX_STEP][4];
int b[MAX_STEP]
char *name[] =
{
"Con las manos vacías",
"Trae un lobo",
"Trae una oveja",
"Trae verduras"
};
búsqueda vacía(int iStep)
{
int
if (a[iStep][0] a[iStep][1] a[iStep][2] a[iStep][3] == 4)
{
for (i = 0 ; i lt; iStep; i )
{
if (a[i][3] == 0)
{
printf("está al otro lado\n", nombre[b[i] 1]
}
else
{
printf("ha regresado a la costa de origen\n", nombre[b[i] 1]);
printf("\ n");
retorno;
}
para (i = 0; i lt; iStep; i)
{
if (memcmp(a[i], a[iStep], sizeof(a[i])) == 0)
{
retorno;
}
}
si (un[iPaso][1] != un[iPaso][3) ] amplificador; amplificador (a[iStep][ 2] == a[iStep][1] || a[iStep][0] == a[iStep][1]))
{
retorno;
p>}
para (i = -1; i lt; = 2; i)
{
b[iPaso] = i;
memcpy(a[iPaso 1], a[iPaso], tamaño de(a[iPaso 1])); a[iPaso 1][3] = 1 - a[iPaso 1][3]
if (i == -1)
{
buscar(iPaso 1);
}
else if (a[iPaso][i] == a[iPaso][3])
{
a[iPaso 1][i ] = a[iPaso 1][3]
búsqueda(iPaso 1
}
<); p>}} p>
int principal() <
/p>
{
búsqueda(0);
devuelve 0;