public static bool VsSkip(vi _iVid) { if (_iVid == vi.Vs1L) { return(OM.DevInfo.bVs1_Skip || OM.DevInfo.bVsL_NotUse); } else if (_iVid == vi.Vs1R) { return(OM.DevInfo.bVs1_Skip || OM.DevInfo.bVsR_NotUse); } else if (_iVid == vi.Vs2L) { return(OM.DevInfo.bVs2_Skip || OM.DevInfo.bVsL_NotUse); } else if (_iVid == vi.Vs2R) { return(OM.DevInfo.bVs2_Skip || OM.DevInfo.bVsR_NotUse); } else if (_iVid == vi.Vs3L) { return(OM.DevInfo.bVs3_Skip || OM.DevInfo.bVsL_NotUse); } else if (_iVid == vi.Vs3R) { return(OM.DevInfo.bVs3_Skip || OM.DevInfo.bVsR_NotUse); } else { return(true); } }
private static bool TryUpdateCorrectGuesses(vi number, vi comb) { for (int g = 0; g < GuessAttempts.Guess.Count; ++g) { for (int j = 0; j < comb.Count; ++j) { if (GuessAttempts.Guess[g][comb[j]] == number[comb[j]]) { --GuessAttempts.RemainCorrectGuesses[g]; GuessAttempts.Guess[g][comb[j]] = -1; } if (GuessAttempts.RemainCorrectGuesses[g] < 0) { return(false); } } } int maxRemainGuesses = GuessAttempts.RemainCorrectGuesses.Max(); if (maxRemainGuesses > 0 && maxRemainGuesses > number.Count(c => c == -1)) { return(false); } return(true); }
static void Main() { var sw = new Stopwatch(); sw.Start(); var sets = GenerateAllSets(); vi number = Enumerable.Repeat(-1, GuessAttempts.Guess[0].Count).ToList(); BacktrackGuess(sets, number, 0); sw.Stop(); WriteLine("Elapsed = {0}", sw.Elapsed); }
private static bool TrySetNewDigits(vi number, vi indices, int guessIdx) { foreach (var idx in indices) { if (number[idx] == -1) { number[idx] = GuessAttempts.Guess[guessIdx][idx]; } else { return(false); } } return(true); }
private static void PrintNumber(vi number) { Write("Candidate number: "); foreach (var n in number) { if (n == -1) { Write($"*"); } else { Write(n); } } WriteLine(); }
private static void GenerateSet_nk(int n, int k, vi comb, vvi set) { int size = comb.Count; if (size == k) { set.Add(size != 0 ? new vi(comb) : new vi()); return; } int last = size == 0 ? -1 : comb[size - 1]; for (int i = last + 1; i < size + n - k + 1; ++i) { comb.Add(i); GenerateSet_nk(n, k, comb, set); comb.RemoveAt(size); } }
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; } }
static GuessAttempts() { ParseRawInputToArrays(); RemainCorrectGuesses = new vi(CorrectGuessesInitial); }