нашел эту головоломку ЗДЕСЬ... Я сделал решение грубой силы, и я хотел бы знать, как вы его решаете...
Buzz, Woody, Rex и Hamm должны бежать из Zurg (a) Они просто должны пересечь один последний мост, прежде чем они свободны. Однако мост является хрупким и может удерживать максимум два из них одновременно. Кроме того, чтобы пересечь мост, необходим фонарик для избегать ловушек и сломанных деталей. Проблема в том, что у наших друзей есть только один фонарик с одной батареей, которая длится всего 60 минут (это не опечатка: шестьдесят). Игрушки нужны разное время пересечения моста (в любом направлении):
TOY TIME
Buzz 5 minutes
Woody 10 minutes
Rex 20 minutes
Hamm 25 minutes
Так как на мосту одновременно может быть только две игрушки, они не могут пересечь мост все сразу. Поскольку им нужен фонарик, чтобы пересечь мост, пересек мост, кто-то должен вернуться и принести фонарик к этим игрушкам на другой стороне, которая все еще должна пересечь мост. Теперь проблема заключается в следующем: в каком порядке четыре игрушки могут пересечь мост во времени (что через 60 минут), чтобы спастись от Цурга?
//(a) These are characters from the animation movie "Toy Story 2".
вот мое решение:
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();
}
}