private static void prepare(Cube c, SortedDiceMultiList q) { // Dla każdej kostki LinkedList<Dice> toHeur = new LinkedList<Dice>(); foreach (var dice in c) { // Dla każdej ścianki na kostce bool hasZero = false; for (int dir = 0; dir < 6;dir++ ) { Face face = dice.faces[dir]; // Sprawdzamy w którą stronę kieruje się ścianka(malejąco, czy rosnąco z x) int op = dir.Operand(); // Sprawdzamy na której osi leży kostka(0-y, 1-x, 2-z) int ax = dir.Axis(); // Pobieramy wspórzędną kostki od interesujacej nas osi int ind = dice[ax]; // Jeśli kostka ma zero, nie ma co więcej liczyć, zawsze można ją usunąć if (face.startValue == 0) { // poprawiamy najlpeszą wartość na kostce hasZero = true; } // Kostki nie da się usunąć(wymiary wykraczają poza sześcian) else if (ind + face.startValue * op >= c[ax] || ind + face.startValue * op < 0) { // ustawiamy ściankę na nieaktywną, kostkę na nieaktywną. face.InActive = false; face.currentValue = int.MaxValue; dice.activeFaces--; } // Być może obliczona wartosć jest najlepsza dla kostki //else if(face.currentValue < dice.bestValue) //{ // dice.bestValue = face.currentValue; //} } // Jeśli nie mamy aktywnych ścianek, to nie mamy aktywnej kostki if(dice.activeFaces == 0) { //dice.active = false; c.ActiveDices --; } // Możemy usunąć tą kostkę, obliczmy jej heurystykę i dodajmy do kolejki. if(hasZero) { //c.Heuristic(dice); //q.Add(dice); toHeur.AddLast(dice); } } foreach (var dice in toHeur) { c.Heuristic(dice, 0); q.Add(dice); } }