Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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());
        }