public override BoardSolver.SolveResult RestrictGrid(BoardSolver bs) { var ss = bs.final.sudoku.GetVariant(VariantList.VariantType.Sandwich.ToString()).serializer as SandwichSerializer; bool changed = false; foreach (var box in ss.serializedObject.boxes) { var points = new List <(int x, int y)>(); if (box.posx == BoxController.topBox || box.posx == BoxController.botBox) { int oneIndex = -1; int oneCounts = 0; int nineIndex = -1; int nineCounts = 0; for (int i = 0; i < bs.final.sudoku.settings.numHorizontal; i++) { if (bs.Allows(box.posy, i, 1.ToString())) { oneCounts++; oneIndex = i; } if (bs.Allows(box.posy, i, 9.ToString())) { nineCounts++; nineIndex = i; } } if (oneCounts == 1 && nineCounts == 1) { for (int i = Mathf.Min(oneIndex, nineIndex) + 1; i < Mathf.Max(oneIndex, nineIndex); i++) { points.Add((box.posy, i)); } } } else if (box.posy == BoxController.topBox || box.posy == BoxController.botBox) { int oneIndex = -1; int oneCounts = 0; int nineIndex = -1; int nineCounts = 0; for (int j = 0; j < bs.final.sudoku.settings.numHorizontal; j++) { if (bs.Allows(j, box.posx, 1.ToString())) { oneCounts++; oneIndex = j; } if (bs.Allows(j, box.posx, 9.ToString())) { nineCounts++; nineIndex = j; } } if (oneCounts == 1 && nineCounts == 1) { for (int j = Mathf.Min(oneIndex, nineIndex) + 1; j < Mathf.Max(oneIndex, nineIndex); j++) { points.Add((j, box.posx)); } } } else { continue; } var r = SumUtility.RestrictSum(bs, points, int.Parse(box.answer)); if (r == BoardSolver.SolveResult.Impossible) { return(r); } if (r == BoardSolver.SolveResult.Solved) { changed = true; } } if (changed) { return(BoardSolver.SolveResult.Solved); } return(BoardSolver.SolveResult.Unchanged); }
public override BoardSolver.SolveResult RestrictGrid(BoardSolver bs) { bool changed = false; for (int v = 1; v <= 9; v++) { for (int i = 0; i < bs.final.sudoku.settings.numHorizontal; i++) { int v_located = 0; for (int j = 0; j < bs.final.sudoku.settings.numVertical; j++) { if (bs.Allows(i, j, v.ToString())) { v_located++; } } if (v_located == 0) { return(BoardSolver.SolveResult.Impossible); } if (v_located == 1) { for (int j = 0; j < bs.final.sudoku.settings.numVertical; j++) { if (bs.Allows(i, j, v.ToString()) && bs.GetValue(i, j) != v.ToString()) { changed = true; bs.SetValue(i, j, v.ToString()); } } } } for (int j = 0; j < bs.final.sudoku.settings.numVertical; j++) { int v_located = 0; for (int i = 0; i < bs.final.sudoku.settings.numHorizontal; i++) { if (bs.Allows(i, j, v.ToString())) { v_located++; } } if (v_located == 0) { return(BoardSolver.SolveResult.Impossible); } if (v_located == 1) { for (int i = 0; i < bs.final.sudoku.settings.numHorizontal; i++) { if (bs.Allows(i, j, v.ToString()) && bs.GetValue(i, j) != v.ToString()) { changed = true; bs.SetValue(i, j, v.ToString()); } } } } for (int a = 0; a < bs.final.sudoku.settings.numHorizontal; a += (int)(bs.final.sudoku.settings.numHorizontalThins + 1)) { for (int b = 0; b < bs.final.sudoku.settings.numVertical; b += (int)(bs.final.sudoku.settings.numVerticalThins + 1)) { // Check for box (a, b) int v_located = 0; for (int x = 0; x < (bs.final.sudoku.settings.numHorizontalThins + 1); x++) { for (int y = 0; y < (bs.final.sudoku.settings.numVerticalThins + 1); y++) { if (bs.Allows(a + x, b + y, v.ToString())) { v_located++; } } } if (v_located == 0) { return(BoardSolver.SolveResult.Impossible); } if (v_located == 1) { for (int x = 0; x < (bs.final.sudoku.settings.numHorizontalThins + 1); x++) { for (int y = 0; y < (bs.final.sudoku.settings.numVerticalThins + 1); y++) { if (bs.Allows(a + x, b + y, v.ToString()) && bs.GetValue(a + x, b + y) != v.ToString()) { changed = true; bs.SetValue(a + x, b + y, v.ToString()); } } } } } } } if (changed) { return(BoardSolver.SolveResult.Solved); } return(BoardSolver.SolveResult.Unchanged); }