Example #1
0
        internal SudokuSolutionNode Step(SudokuSolutionNode a_node, SudokuSolutionType a_type)
        {
            if (a_node.Board.IsEmpty)
            {
                return(new SudokuSolutionNode(a_node.Board, SudokuSolutionNodeState.Unsolvable));
            }

            if (a_node.StepMode != SudokuSolutionNodeStepMode.StepAllAlgorithms)
            {
                Debug.Assert(!a_node.Nodes.Any());

                a_node.StepMode = SudokuSolutionNodeStepMode.StepSelectedAlgorithm;

                List <SudokuSolution> solution_nodes = SudokuSolutionTypeToSolvingFunction(a_type)(a_node.NextBoard, true);

                solution_nodes = SudokuSolutionNode.Consolidate(solution_nodes.Distinct().ToList());

                foreach (SudokuSolution solution in solution_nodes)
                {
                    if (!a_node.Nodes.Any(n => n.Solution.Equals(solution)))
                    {
                        a_node.AddNode(a_node.NextBoard, SudokuSolutionNodeState.Solution, solution);
                    }
                }
            }

            return(a_node.Nodes.FirstOrDefault(node => node.Solution.Type == a_type));
        }
Example #2
0
        private static void LoadNodesFromXML(XElement a_element, SudokuSolutionNode a_parent)
        {
            a_element.Element("solution_nodes").Elements().ForEach(child_element =>
            {
                SudokuBoard board             = SudokuBoard.LoadFromXML(child_element.Element("board"));
                SudokuSolutionNode child_node = a_parent.AddNode(
                    board,
                    (SudokuSolutionNodeState)Enum.Parse(typeof(SudokuSolutionNodeState), child_element.Attribute("state").Value),
                    SudokuSolution.LoadFromXML(child_element.Element("solution"), board)
                    );

                LoadNodesFromXML(child_element, child_node);
            });
        }
Example #3
0
        internal SudokuSolutionNode Step(SudokuSolutionNode a_node)
        {
            if (a_node.Board.IsEmpty)
            {
                return(new SudokuSolutionNode(a_node.Board, SudokuSolutionNodeState.Unsolvable));
            }

            if ((a_node.StepMode != SudokuSolutionNodeStepMode.StepFirstSolution) &&
                (a_node.StepMode != SudokuSolutionNodeStepMode.StepAllAlgorithms))
            {
                a_node.StepMode = SudokuSolutionNodeStepMode.StepFirstSolution;

                if (a_node.State == SudokuSolutionNodeState.State)
                {
                    List <SudokuSolution> solutions = null;

                    if (a_node.NextBoard.IsSolvable)
                    {
                        // PLINQ
                        solutions = (from func in m_simple_funcs.Concat(m_complex_funcs)
                                     select func(a_node.NextBoard, false)).FirstOrDefault(sols => sols.Count > 0);
                    }

                    if (solutions != null)
                    {
                        solutions = SudokuSolutionNode.Consolidate(RemoveOverlapped(solutions.Distinct().ToList()));

                        if (solutions.Count == 0)
                        {
                            solutions = null;
                        }
                    }

                    if (solutions != null)
                    {
                        foreach (SudokuSolution solution in solutions)
                        {
                            SudokuSolutionNode node = a_node.AddNode(a_node.NextBoard, SudokuSolutionNodeState.Solution, solution);
                            node = node.AddNode(node.NextBoard, SudokuSolutionNodeState.State);
                            UpdateState(node, false);
                        }

                        a_node = a_node.Nodes.First().Nodes.First();
                    }
                    else
                    {
                        UpdateState(a_node, true);
                    }
                }
                else
                {
                    a_node = a_node.AddNode(a_node.NextBoard, SudokuSolutionNodeState.State);
                    UpdateState(a_node, false);
                }
            }
            else
            {
                if (a_node.Nodes.Any())
                {
                    a_node = a_node.Nodes.First();
                }
                else
                {
                    UpdateState(a_node, true);
                }
            }

            return(a_node);
        }
Example #4
0
        internal void StepAll(SudokuSolutionNode a_node)
        {
            if (a_node.StepMode == SudokuSolutionNodeStepMode.StepAllAlgorithms)
            {
                return;
            }

            a_node.StepMode = SudokuSolutionNodeStepMode.StepAllAlgorithms;

            if ((a_node.State == SudokuSolutionNodeState.Solved) ||
                (a_node.State == SudokuSolutionNodeState.Unsolvable) ||
                (a_node.State == SudokuSolutionNodeState.Unsolved))
            {
                return;
            }

            if (a_node.Board.IsEmpty)
            {
                return;
            }

            if (a_node.State == SudokuSolutionNodeState.Solution)
            {
                if (!a_node.Nodes.Any())
                {
                    a_node = a_node.AddNode(a_node.NextBoard, SudokuSolutionNodeState.State);
                    UpdateState(a_node, false);
                }
            }
            else
            {
                ConcurrentBag <SudokuSolution> solution_nodes = new ConcurrentBag <SudokuSolution>();

                Parallel.ForEach(m_simple_funcs, func =>
                {
                    List <SudokuSolution> list = func(a_node.NextBoard, true);
                    foreach (var sol in list)
                    {
                        solution_nodes.Add(sol);
                    }
                });

                if (solution_nodes.Count == 0)
                {
                    Parallel.ForEach(m_complex_funcs, func =>
                    {
                        List <SudokuSolution> list = func(a_node.NextBoard, true);
                        foreach (var sol in list)
                        {
                            solution_nodes.Add(sol);
                        }
                    });
                }

                List <SudokuSolution> solution_nodes_1 = SudokuSolutionNode.Consolidate(solution_nodes.Distinct().ToList());

                foreach (SudokuSolution solution in solution_nodes_1)
                {
                    if (!a_node.Nodes.Any(n => n.Solution.Equals(solution)))
                    {
                        a_node.AddNode(a_node.NextBoard, SudokuSolutionNodeState.Solution, solution);
                    }
                }
            }
        }