Example #1
0
        private void ShowNotesForSquare(ISudokuSquare square)
        {
            if (square.GetText().Trim().Length > 0)
            {
                return;
            }

            ShowNotesForSquareAt(square);
        }
Example #2
0
        bool BruteForceAttack(int startingRow = 0, int startingColumn = 0)
        {
            if (startingColumn >= 9)
            {
                startingColumn = 0;
                startingRow++;
            }
            for (int row = startingRow; row < 9; row++)
            {
                for (int column = startingColumn; column < 9; column++)
                {
                    startingColumn = 0;
                    ISudokuSquare sudokuSquare = SudokuBoard.squares[row, column];
                    if (!sudokuSquare.IsEmpty)
                    {
                        continue;
                    }
                    // Magic - I have an empty square!!!
                    if (sudokuSquare.Notes == "")
                    {
                        ShowNotesForSquareAt(sudokuSquare);
                        if (sudokuSquare.Notes == "")                          // That means we have a conflict.
                        {
                            return(BruteForceAttack(row, column + 1));
                        }
                    }

                    List <int> notes = BaseGroupSolver.GetNumbers(sudokuSquare.Notes);

                    foreach (int number in notes)
                    {
                        sudokuSquare.Value        = number.ToString()[0];
                        sudokuSquare.HasTestValue = true;
                        numCombinationsTried++;
                        if (HasConflicts(row, column))
                        {
                            sudokuSquare.Value        = Char.MinValue;
                            sudokuSquare.HasTestValue = false;
                        }
                        else if (BruteForceAttack(row, column + 1))
                        {
                            sudokuSquare.Notes = "";
                            return(true);
                        }
                        else
                        {
                            sudokuSquare.Value        = Char.MinValue;
                            sudokuSquare.HasTestValue = false;
                        }
                    }
                    return(false);
                }
            }

            return(AllSquaresAreFilled());
        }
Example #3
0
 bool NoteCountsAreSufficient(ISudokuSquare[] group, List <int> indicesToCheck, out List <List <int> > allNoteNumbers)
 {
     allNoteNumbers = new List <List <int> >();
     foreach (int index in indicesToCheck)
     {
         ISudokuSquare square            = group[index];
         List <int>    squareNoteNumbers = GetNumbers(square.Notes);
         allNoteNumbers.Add(squareNoteNumbers);
         if (squareNoteNumbers.Count < 2 || squareNoteNumbers.Count > indicesToCheck.Count)
         {
             return(false);
         }
     }
     return(true);
 }
Example #4
0
        bool GroupAlreadyIsShowing(ISudokuSquare[] group, int note)
        {
            char noteChar = note.ToString()[0];

            for (int i = 0; i < group.Length; i++)
            {
                ISudokuSquare sudokuSquare = group[i];
                if (sudokuSquare.Value == noteChar)
                {
                    return(true);
                }
            }

            return(false);
        }
Example #5
0
 bool AllSquaresAreFilled()
 {
     for (int row = 0; row < 9; row++)
     {
         for (int column = 0; column < 9; column++)
         {
             ISudokuSquare sudokuSquare = SudokuBoard.squares[row, column];
             if (sudokuSquare.IsEmpty)
             {
                 return(false);
             }
         }
     }
     return(true);
 }
Example #6
0
        public override SolveResult Solve(ISudokuSquare[] group, GroupKind groupKind)
        {
            SolveResult result = SolveResult.None;

            Dictionary <int, int> numbersFound = new Dictionary <int, int>();

            for (int i = 0; i < group.Length; i++)
            {
                ISudokuSquare sudokuSquare = group[i];
                List <int>    notes        = GetNumbers(sudokuSquare.Notes);
                foreach (int note in notes)
                {
                    if (!numbersFound.ContainsKey(note))
                    {
                        numbersFound.Add(note, 1);
                    }
                    else
                    {
                        numbersFound[note]++;
                    }
                }
            }

            foreach (int note in numbersFound.Keys)
            {
                if (numbersFound[note] == 1)
                {
                    int onlyOneNote = note;
                    if (GroupAlreadyIsShowing(group, onlyOneNote))
                    {
                        continue;
                    }
                    // note has to be in this square!
                    for (int i = 0; i < group.Length; i++)
                    {
                        ISudokuSquare sudokuSquare = group[i];
                        List <int>    notes        = GetNumbers(sudokuSquare.Notes);
                        if (notes.Contains(onlyOneNote))
                        {
                            sudokuSquare.Notes = "";
                            sudokuSquare.Value = onlyOneNote.ToString()[0];
                            result             = SolveResult.SquaresSolved;
                        }
                    }
                }
            }
            return(result);
        }
Example #7
0
        private void ShowNotesForSquareAt(ISudokuSquare square)
        {
            ISudokuSquare[] column = SudokuBoard.GetColumn(square.Column);
            ISudokuSquare[] row    = SudokuBoard.GetRow(square.Row);
            ISudokuSquare[] block  = SudokuBoard.GetBlock(square.Row, square.Column);

            List <char> availableChars = new List <char>();

            foreach (char item in tbxAvailableCharacter.Text)
            {
                availableChars.Add(item);
            }

            RemoveCharactersFromGroup(availableChars, row);
            RemoveCharactersFromGroup(availableChars, column);
            RemoveCharactersFromGroup(availableChars, block);

            square.SetNotes(string.Join(", ", availableChars));
        }
Example #8
0
        public SolveResult RemoveNotesFrom(ISudokuSquare sudokuSquare, string notes)
        {
            if (string.IsNullOrEmpty(sudokuSquare.Notes))
            {
                return(SolveResult.None);
            }
            else
            {
                List <int> toRemoveList = GetNumbers(notes);
                List <int> squareNotes  = GetNumbers(sudokuSquare.Notes);
                foreach (int numberToRemove in toRemoveList)
                {
                    squareNotes.Remove(numberToRemove);
                }

                string newNotes = string.Join(", ", squareNotes);
                if (newNotes != sudokuSquare.Notes)
                {
                    sudokuSquare.Notes = newNotes;
                    return(SolveResult.SquaresSolved);
                }
            }
            return(SolveResult.None);
        }
Example #9
0
        bool CheckForConflicts(int r, int c, bool setHasConflictedProperty = true)
        {
            ISudokuSquare thisSquare = SudokuBoard.squares[r, c];
            string        text       = thisSquare.GetText();

            if (string.IsNullOrWhiteSpace(text))
            {
                return(false);
            }

            ISudokuSquare[] column = SudokuBoard.GetColumn(c);
            ISudokuSquare[] row    = SudokuBoard.GetRow(r);
            ISudokuSquare[] block  = SudokuBoard.GetBlock(r, c);

            bool isConflicted = false;

            for (int rowIndex = 0; rowIndex < 9; rowIndex++)
            {
                if (rowIndex != r && column[rowIndex].GetText() == text)
                {
                    if (setHasConflictedProperty)
                    {
                        thisSquare.HasConflict       = true;
                        column[rowIndex].HasConflict = true;
                    }
                    isConflicted = true;
                }
            }

            for (int colIndex = 0; colIndex < 9; colIndex++)
            {
                if (colIndex != c && row[colIndex].GetText() == text)
                {
                    if (setHasConflictedProperty)
                    {
                        thisSquare.HasConflict    = true;
                        row[colIndex].HasConflict = true;
                    }
                    isConflicted = true;
                }
            }

            for (int squareIndex = 0; squareIndex < 9; squareIndex++)
            {
                GetSquarePosition(block[squareIndex], out int blockRow, out int blockColumn);
                if (blockRow == r && blockColumn == c)
                {
                    continue;
                }

                if (block[squareIndex].GetText() == text)
                {
                    if (setHasConflictedProperty)
                    {
                        thisSquare.HasConflict         = true;
                        block[squareIndex].HasConflict = true;
                    }
                    isConflicted = true;
                }
            }

            return(isConflicted);
        }
Example #10
0
 void GetSquarePosition(ISudokuSquare square, out int row, out int column)
 {
     row    = square.Row;
     column = square.Column;
 }