Esempio n. 1
0
        private void BruteForce()
        {
            for (int i = 0; i < Size; ++i)
            {
                for (int k = 0; k < Size; ++k)
                {
                    SudokuPiece sp = board[i, k];
                    if (sp.Value != 0 || sp.PossibleValues.Count != 2) { continue; }

                    var clone1 = (SudokuPuzzle)this.Clone();
                    clone1.board[i, k] = new SudokuPiece(sp.PossibleValues[0]);
                    clone1.Solve();
                    if (clone1.RemainingPieces == 0)
                    {
                        this.board = clone1.board;
                    }
                    else
                    {
                        var clone2 = (SudokuPuzzle)this.Clone();
                        clone2.board[i, k] = new SudokuPiece(sp.PossibleValues[1]);
                        clone2.Solve();
                        if (clone2.RemainingPieces == 0)
                        {
                            this.board = clone2.board;
                        }
                    }
                }
            }
        }
Esempio n. 2
0
 internal SudokuPiece[] GetRow(int row)
 {
     var result = new SudokuPiece[Size];
     for (int i = 0; i < Size; i++)
     {
         result[i] = board[row, i];
     }
     return result;
 }
Esempio n. 3
0
 internal SudokuPiece[] GetColumn(int column)
 {
     var result = new SudokuPiece[Size];
     for (int i = 0; i < Size; i++)
     {
         result[i] = board[i, column];
     }
     return result;
 }
Esempio n. 4
0
        private bool UpdateCandidatesOnY(int i, KeyValuePair<int, int> item)
        {
            SudokuPiece sp = board[i, item.Value];
            if (sp.Value != 0) { return false; }

            sp.PossibleValues.Remove(item.Key);

            if (sp.PossibleValues.Count == 1)
            {
                AssignCell(i, item.Value, sp.PossibleValues[0]);
                return true;
            }

            return false;
        }
Esempio n. 5
0
        private static IDictionary<int, CandidateHelper> UniquePencilmarks(IList<SudokuPiece> p)
        {
            Dictionary<int, CandidateHelper> result = new Dictionary<int, CandidateHelper>();

            for (int i = 0; i < p.Count; ++i)
            {
                SudokuPiece sp = p[i];
                if (sp.Value != 0 || sp.PossibleValues == null || sp.PossibleValues.Count == 0) continue;
                int count = sp.PossibleValues.Count;
                for (int k = 0; k < count; ++k)
                {
                    int keyValue = sp.PossibleValues[k];
                    result[keyValue] = result.ContainsKey(keyValue) == false ? new CandidateHelper(1, i) : new CandidateHelper(result[keyValue]);
                }
            }

            return FilterUniques(result);
        }
Esempio n. 6
0
        private SudokuPiece[,] GetArea(int x, int y, int size)
        {
            var result = new SudokuPiece[size,size];

            int deltaX = size + x;
            int deltaY = size + y;

            int ci = 0;
            for (int i = x; i < deltaX; ++i, ++ci)
            {
                int ck = 0;
                for (int k = y; k < deltaY; ++k, ++ck)
                {
                    result[ci, ck] = board[i, k];
                }
            }

            return result;
        }
Esempio n. 7
0
        public static SudokuPuzzle Create(int[,] board)
        {
            if (board == null || board.GetUpperBound(0) != 8 || board.GetUpperBound(1) != 8)
            {
                throw new ArgumentException("board");
            }

            int size = board.GetUpperBound(0) + 1;

            SudokuPiece[,] puzzle = new SudokuPiece[size, size];

            for (int i = 0; i < size; ++i)
            {
                for (int k = 0; k < size; ++k)
                {
                    int value = board[i, k];
                    puzzle[i, k] = new SudokuPiece(value);
                }
            }

            return(new SudokuPuzzle(puzzle));
        }
Esempio n. 8
0
        private static IDictionary<int, CandidateHelper> UniquePencilmarks(SudokuPiece[,] p)
        {
            Dictionary<int, CandidateHelper> result = new Dictionary<int, CandidateHelper>();

            for (int i = 0; i < Slice; ++i)
            {
                for (int k = 0; k < Slice; ++k)
                {
                    SudokuPiece sp = p[k, i];
                    if (sp.Value != 0 || sp.PossibleValues == null || sp.PossibleValues.Count == 0)
                    {
                        continue;
                    }
                    for (int w = 0; w < sp.PossibleValues.Count; ++w)
                    {
                        int keyValue = sp.PossibleValues[w];
                        result[keyValue] = result.ContainsKey(keyValue) == false ? new CandidateHelper(1, i, k) : new CandidateHelper(result[keyValue]);
                    }
                }
            }

            return FilterUniques(result);
        }
Esempio n. 9
0
        private static IDictionary<int, IList<Point>> GetCandidates(SudokuPiece[,] area, int deltaX, int deltaY)
        {
            IDictionary<int, IList<Point>> candidates = new Dictionary<int, IList<Point>>();

            for (int i = 0; i < Slice; ++i)
            {
                for (int k = 0; k < Slice; ++k)
                {
                    SudokuPiece temp = area[i, k];
                    if (temp.Value != 0) { continue; }
                    IList<int> pv = temp.PossibleValues;
                    for (int w = 0; w < pv.Count; ++w)
                    {
                        int value = pv[w];
                        if (candidates.ContainsKey(value) == false)
                        {
                            candidates[value] = new List<Point>();
                        }
                        candidates[value].Add(new Point(k + deltaX, i + deltaY));
                    }
                }
            }
            return candidates;
        }