private static Grid Solve(SamplePuzzle samplePuzzle) { var rooms = samplePuzzle.Rooms; var initialValues = samplePuzzle.InitialValues; var numRows = rooms.SelectMany(r => r.Cells).Max(c => c.Row) + 1; var numCols = rooms.SelectMany(r => r.Cells).Max(c => c.Col) + 1; var maxValue = rooms.Max(r => r.Cells.Count); var internalRows1 = rooms.SelectMany(room => BuildInternalRowsForRoom(rooms, initialValues, room)); var internalRows2 = initialValues.Select(t => BuildInternalRow(rooms, t.Item1, t.Item2, true)); var internalRows = internalRows1.Concat(internalRows2).ToImmutableList(); var dlxRows = BuildDlxRows(rooms, numRows, numCols, maxValue, internalRows); var numRowColPrimaryColumns = numRows * numCols; var numCellWithinRoomPrimaryColumns = rooms.Sum(r => r.Cells.Count); var numPrimaryColumns = numRowColPrimaryColumns + numCellWithinRoomPrimaryColumns; var dlx = new Dlx(); var solutions = dlx.Solve(dlxRows, d => d, r => r, numPrimaryColumns).ToList(); Console.WriteLine($"Number of solutions found: {solutions.Count}"); var firstSolution = solutions.FirstOrDefault(); if (firstSolution == null) return null; var subsetOfInternalRows = firstSolution.RowIndexes.Select(idx => internalRows[idx]).ToImmutableList(); var orderedSubsetOfInternalRows = subsetOfInternalRows.OrderBy(t => t.Item1.Row).ThenBy(t => t.Item1.Col); var rowStrings = Enumerable.Range(0, numRows).Select(row => string.Join("", orderedSubsetOfInternalRows.Skip(row * numCols).Take(numRows).Select(t => t.Item2))); var grid = new Grid(rowStrings.ToImmutableList()); return grid; }
private static Grid SamplePuzzleToGrid(SamplePuzzle samplePuzzle) { var rooms = samplePuzzle.Rooms; var initialValues = samplePuzzle.InitialValues; var numRows = rooms.SelectMany(r => r.Cells).Max(c => c.Row) + 1; var numCols = rooms.SelectMany(r => r.Cells).Max(c => c.Col) + 1; var rows = Enumerable.Range(0, numRows).Select(_ => new string(' ', numCols)).ToList(); foreach (var initialValue in initialValues) { var row = initialValue.Item1.Row; var col = initialValue.Item1.Col; var value = initialValue.Item2; var s = rows[row]; var cs = s.ToCharArray(); cs[col] = Convert.ToChar('0' + value); rows[row] = new string(cs); } return new Grid(rows.ToImmutableList()); }