public static long Solve(Solut sol, long k) { var palTree = sol.PalTree; var str = sol.Str; var suffRevAdj = sol.SuffRevAdj; var sums = sol.Sums; var hashes = sol.Hashes; var node = 2; var sum = 0L; while (true) { var found = false; var adj = suffRevAdj[node]; if (adj.Count > 1 && !sol.IsSuffRevAdjSorted[node]) { adj.Sort((v1, v2) => CompareNodes(node, v1, v2, palTree, str)); sol.IsSuffRevAdjSorted[node] = true; } foreach (var next in suffRevAdj[node]) { var nextVal = palTree.tree[next].num; var nextSum = sums[next]; if (sum + nextVal >= k) { return(hashes[next]); } if (sum + nextSum >= k) { sum += nextVal; node = next; found = true; break; } sum += nextSum; } if (!found) { return(-1); } } }
/// <summary> /// Luo jokaiselle solut taulukon paikalle oman Solut-objektin ja lisää niiden Ruudut kentälle /// </summary> public void LuoSoluTaulukko(int soluKoko) { solut = new Solut[sarakkeet, rivit]; for (int i = 0; i < sarakkeet; i++) { for (int j = 0; j < rivit; j++) { solut[i, j] = new Solut(false, false, false, false) { Ruutu = new GameObject(soluKoko, soluKoko, Shape.Rectangle) { X = Level.Left + (i * soluKoko) + soluKoko / 2, Y = Level.Top - (j * soluKoko) - soluKoko / 2 - 50, Image = alkuBoxi }, }; Add(solut[i, j].Ruutu); } } }