Пример #1
0
        /// <summary>
        /// Standard constructor
        /// </summary>
        public SudokuSolver(SudokuData problem)
            : base()
        {
            m_Problem = problem ?? throw new ArgumentNullException(nameof(problem));

            CoreCreateData();
        }
Пример #2
0
        /// <summary>
        /// Clone
        /// </summary>
        public SudokuData Clone()
        {
            SudokuData result = new SudokuData()
            {
                m_Title = this.m_Title
            };

            for (int i = 0; i < m_Data.Length; ++i)
            {
                for (int j = 0; j < m_Data.Length; ++j)
                {
                    result.m_Data[i][j] = m_Data[i][j];
                }
            }

            return(result);
        }
Пример #3
0
        // Core guess
        private void CoreGuess()
        {
            int min     = int.MaxValue;
            int minLine = 0;
            int minCol  = 0;

            for (int i = 0; i < 9; ++i)
            {
                for (int j = 0; j < 9; ++j)
                {
                    List <int> item = m_Data[i][j];

                    if (item.Count <= 1)
                    {
                        continue;
                    }

                    if (item.Count < min)
                    {
                        min     = item.Count;
                        minLine = i;
                        minCol  = j;
                    }
                }
            }

            SudokuSolver solver = Clone();

            solver.m_Data[minLine][minCol].Remove(m_Data[minLine][minCol][0]);

            SudokuData solution = solver.Solve();

            if (solution.IsValid)
            {
                CoreAssign(solver);

                return;
            }

            int v = m_Data[minLine][minCol][0];

            m_Data[minLine][minCol].Clear();
            m_Data[minLine][minCol].Add(v);
        }
        /// <summary>
        /// Solve
        /// </summary>
        public SudokuData Solve()
        {
            CoreSolve();

            if (!IsCorrect)
            {
                return(new SudokuData());
            }

            SudokuData result = new SudokuData();

            for (int i = 0; i < 9; ++i)
            {
                for (int j = 0; j < 9; ++j)
                {
                    result[i, j] = m_Data[i][j][0];
                }
            }

            return(result);
        }
Пример #5
0
        /// <summary>
        /// From string
        /// </summary>
        public static SudokuData FromString(String value)
        {
            if (String.IsNullOrEmpty(value))
            {
                return(null);
            }

            IList <String> lines = value.SplitToLines().ToList();

            if (lines.Count < 9)
            {
                throw new ArgumentException("Wrong format of a Sudoku puzzle.", "value");
            }

            int count = 0;

            for (int i = lines.Count - 1; i >= 0; --i)
            {
                if (count >= 9)
                {
                    break;
                }

                lines[i] = lines[i].Trim();

                if (String.IsNullOrEmpty(lines[i]))
                {
                    lines.RemoveAt(i);
                }
                else
                {
                    count += 1;
                }
            }

            if (lines.Count < 9)
            {
                throw new ArgumentException("Wrong format of a Sudoku puzzle.", "value");
            }

            SudokuData result = new SudokuData();

            StringBuilder Sb = new StringBuilder();

            for (int i = 0; i < lines.Count - 9; ++i)
            {
                if (Sb.Length > 0)
                {
                    Sb.AppendLine();
                }

                Sb.Append(lines[i]);
            }

            result.Title = Sb.ToString();

            for (int i = 0; i < 9; ++i)
            {
                String line = lines[lines.Count - 9 + i].Replace(" ", "");

                if (line.Length > 9)
                {
                    throw new ArgumentException("Wrong format of a Sudoku puzzle.", "value");
                }

                for (int j = 0; j < line.Length; ++j)
                {
                    Char Ch = line[j];

                    if ((Ch >= '0') && (Ch <= '9'))
                    {
                        result.m_Data[i][j] = Ch - '0';
                    }
                    else if ((Ch == '*') || (Ch == '.') || (Ch == 'x') || (Ch == '?') || (Ch == '_'))
                    {
                        result.m_Data[i][j] = 0;
                    }
                    else
                    {
                        throw new ArgumentException("Wrong format of a Sudoku puzzle.", "value");
                    }
                }
            }

            return(result);
        }