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)); }
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); }
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); } } } }