encontró este rompecabezas HERE ... Me hizo una solución de fuerza bruta y me gustaría saber cómo se woul resolverlo ...¿Cuál es su solución para el rompecabezas "Escape from Zurg" en C#?
Buzz, Woody, Rex y Hamm tienen que escapar de Zurg (a) Ellos simplemente tiene que cruzar un último puente antes de que estén libres. Sin embargo, el puente es frágil y puede contener como máximo dos de ellos al mismo tiempo. Además, para cruzar el puente, se necesita una linterna para , evitar trampas y piezas rotas. El problema es que nuestros amigos solo tienen una linterna con una batería que dura solo 60 minutos (esto no es un error tipográfico: sesenta). Los juguetes deben tiempos diferentes para cruzar el puente (en cualquier dirección):
TOY TIME
Buzz 5 minutes
Woody 10 minutes
Rex 20 minutes
Hamm 25 minutes
Como no puede haber sólo dos juguetes en el puente, al mismo tiempo, no pueden cruzar el puente todos a la vez. Como necesitan la linterna para cruzar el puente, cada vez que dos tienen cruzaron el puente, alguien tiene que regresar y llevar la linterna a los juguetes en del otro lado que todavía tienen que cruzar el puente. El problema ahora es: ¿En qué orden pueden los cuatro juguetes cruzar el puente a tiempo (que es, en 60 minutos) para ser guardado de Zurg?
//(a) These are characters from the animation movie “Toy Story 2”.
aquí está mi solución:
public Form1()
{
InitializeComponent();
List<toy> toys = new List<toy>(){
new toy { name = "buzz", time = 5 } ,
new toy { name = "woody", time = 10 } ,
new toy { name = "rex", time = 20 } ,
new toy { name = "ham", time = 25 } ,
};
var posibles = Combinaciones(toys, 4).ToList(); //all permutations
List<Tuple<string, int>> solutions = new List<Tuple<string, int>>();
foreach (var pointA in posibles)
{
string order = "";
int flashlight = 60;
List<toy> pointB = new List<toy>();
do
{
var fastestInA = pointA.Take(2).ToList();
flashlight -= fastestInA.Max(t => t.time);
order += "go " + String.Join(",", fastestInA.Select(t => t.name)) + "\n";
fastestInA.ForEach(t => pointA.Remove(t));
pointB.AddRange(fastestInA);
if (pointB.Count < 4)
{
var fastestInB = pointB.Take(1).ToList();
flashlight -= fastestInB.Max(t => t.time);
order += "return " + String.Join(",", fastestInB.Select(t => t.name).ToArray()) + "\n";
fastestInB.ForEach(t => pointB.Remove(t));
pointA.AddRange(fastestInB);
}
} while (pointB.Count != 4);
solutions.Add(new Tuple<string, int>(order, flashlight));
}
var optimal = solutions.Where(s => s.Item2 == solutions.Max(t => t.Item2)).ToList();
optimal.ForEach(s => Console.Write("Order:\n" + s.Item1 + "TimeLeft:" + s.Item2 + "\n\n"));
}
public class toy
{
public int time { get; set; }
public string name { get; set; }
}
// this is to do permutations
public static List<List<toy>> Combinaciones(List<toy> list, int take)
{
List<List<toy>> combs = new List<List<toy>>();
foreach (var item in list)
{
var newlist = list.Where(i => !i.Equals(item)).ToList();
var returnlist = take <= 1 ? new List<List<toy>> { new List<toy>() } : Combinaciones(newlist, take - 1);
foreach (var l in returnlist)
{
l.Add(item);
}
combs.AddRange(returnlist);
}
return combs.ToList();
}
}
Aunque está preguntando sobre el método de la fuerza bruta, el punto de activación para resolver el rompecabezas es darse cuenta de que no puede permitirse desperdiciar los tiempos de 20 minutos y de 25 minutos en cruces separados – Gareth
que en realidad encontré este problema busca algún material novato para AI, por lo que el verdadero desafío es hacer que la computadora se dé cuenta de eso sin contar explícitamente. – Luiscencio
La solución es simple, pero no estoy seguro de cómo crear un algoritmo para resolverlo. – buckbova