private static CombinationSets GenerateAllSets() { int n = GuessAttempts.Guess[0].Count; // length of the number var ks = GuessAttempts.RemainCorrectGuesses.GroupBy(c => c) .Select(g => g.First()) .Where(c => c != 0) .ToList(); var dict = new CombinationSets(); foreach (var k in ks) { var set = new vvi(); GenerateSet_nk(n, k, new vi(), set); dict.Add(k, set); } return(dict); }
private static void BacktrackGuess(CombinationSets sets, vi number, int guessIteration) { if (guessIteration == GuessAttempts.Guess.Count) { PrintNumber(number); return; } sets.TryGetValue(GuessAttempts.RemainCorrectGuesses[guessIteration], out var comb); if (comb == null) { BacktrackGuess(sets, number, guessIteration + 1); return; } for (int i = 0; i < comb.Count; ++i) { var initialNumber = number.Select(c => c).ToList(); bool resSet = TrySetNewDigits(number, comb[i], guessIteration); if (resSet) { var initRemainCorrect = GuessAttempts.RemainCorrectGuesses.Select(c => c).ToList(); var initGuesses = GuessAttempts.Guess.Select(c => c.ToList()).ToList(); bool legitimate = TryUpdateCorrectGuesses(number, comb[i]); if (legitimate) { BacktrackGuess(sets, number, guessIteration + 1); } GuessAttempts.RemainCorrectGuesses = initRemainCorrect; GuessAttempts.Guess = initGuesses; } number = initialNumber; } }