예제 #1
0
파일: OptionMan.cs 프로젝트: zoro-008/Works
 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);
     }
 }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
 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);
 }
예제 #5
0
 private static void PrintNumber(vi number)
 {
     Write("Candidate number: ");
     foreach (var n in number)
     {
         if (n == -1)
         {
             Write($"*");
         }
         else
         {
             Write(n);
         }
     }
     WriteLine();
 }
예제 #6
0
        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);
            }
        }
예제 #7
0
        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;
            }
        }
예제 #8
0
 static GuessAttempts()
 {
     ParseRawInputToArrays();
     RemainCorrectGuesses = new vi(CorrectGuessesInitial);
 }