dieses Rätsel gefunden HERE ... Ich habe eine Brute-Force-Lösung gemacht und ich würde gerne wissen, wie Sie es lösen woul ...Was ist Ihre Lösung für das Puzzle "Escape from Zurg" in C#?
Buzz, Woody, Rex und Hamm aus Zurg entkommen müssen (a) Sie Überqueren Sie einfach eine letzte Brücke, bevor sie frei sind. Die Brücke ist jedoch zerbrechlich und kann höchstens zwei von ihnen zur gleichen Zeit halten. Darüber hinaus, um die Brücke zu überqueren, wird eine Taschenlampe benötigt, um Fallen und gebrochene Teile zu vermeiden. Das Problem ist, dass unsere Freunde nur eine Taschenlampe haben mit einer Batterie, die nur 60 Minuten dauert (das ist kein Tippfehler: sechzig). Das Spielzeug braucht verschiedene Zeiten die Brücke zu überqueren (in beiden Richtungen):
TOY TIME
Buzz 5 minutes
Woody 10 minutes
Rex 20 minutes
Hamm 25 minutes
Da es nur zwei Spielzeug auf der Brücke zur gleichen Zeit sein kann, können sie die Brücke auf einmal nicht überqueren. Da sie die Taschenlampe brauchen, um die Brücke zu überqueren, müssen zwei, wenn zwei die Brücke überquert haben, zurückgehen und die Taschenlampe zu den Spielzeugen auf der anderen Seite bringen, die noch die Brücke überqueren müssen. Das Problem ist jetzt: In welcher Reihenfolge können die vier Spielzeuge die Brücke rechtzeitig überqueren (dass ist, in 60 Minuten) von Zurg gerettet werden?
//(a) These are characters from the animation movie “Toy Story 2”.
hier ist meine Lösung:
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();
}
}
Obwohl Sie nach der Brute-Force-Methode fragen, ist der Trigger-Punkt, um das Puzzle tatsächlich zu lösen, zu erkennen, dass Sie nicht die 20 Minuten und 25 Minuten Zeiten auf separaten Übergängen – Gareth
tatsächlich vergeuden können, die ich gefunden habe Dieses Problem auf der Suche nach etwas Neuling Material für KI, so dass die eigentliche Herausforderung ist es, den Computer erkennen, dass ohne explizit zu sagen. – Luiscencio
Die Lösung ist einfach, aber ich bin mir nicht sicher, wie man einen Algorithmus erstellt, wie man das löst. – buckbova