/// <summary> /// Creates a Puzzle from the constraints. /// Internally, the puzzle is automatically solved. /// If the constraints are ambiguous or contradictory, /// an exception is thrown. /// </summary> /// <param name="columnConstraints">Column constraints.</param> /// <param name="rowConstraints">Row constraints.</param> /// <returns>A Puzzle with the given constraints.</returns> /// <exception cref="InvalidConstraintsException">Thrown when the constraints /// don't lead to a single solution.</exception> public static Puzzle FromConstraints(ISequence <Constraints> columnConstraints, ISequence <Constraints> rowConstraints) { var solverGrid = new SolverGrid(columnConstraints, rowConstraints); solverGrid.Refine(); if (!solverGrid.IsSolved) { throw new InvalidConstraintsException(); } else { var grid = ConvertSquareGridToBoolGrid(solverGrid.Squares); return(new Puzzle(columnConstraints: columnConstraints, rowConstraints: rowConstraints, grid: grid)); } }
public IStepwisePuzzleSolver CreateStepwisePuzzleSolver(ISequence <Constraints> rowConstraints, ISequence <Constraints> columnConstraints) { var solverGrid = new SolverGrid(columnConstraints: columnConstraints, rowConstraints: rowConstraints); return(new StepwiseSolver(solverGrid)); }
public AmbiguityChecker(ISequence <Constraints> columnConstraints, ISequence <Constraints> rowConstraints) { this.solver = new SolverGrid(columnConstraints: columnConstraints, rowConstraints: rowConstraints); stepwiseFunction = CreateStepwiseFunction().GetEnumerator(); Ambiguities = this.solver.Squares.Map(DeriveAmbiguity); }
public StepwiseSolver(SolverGrid solverGrid) { this.solverGrid = solverGrid; this.step = new SolveStep(() => RefineColumn(0)); }