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