C# 数独重复数

C# 数独重复数,c#,sudoku,C#,Sudoku,代码工作,数独求解,但如果你写了几个相同的数字,程序会挂起,不会产生错误,它应该会。请帮忙 class Game { private int[,] puzzle = new int[9, 9]; public bool isAvailable(int row, int col, int num) { int rowStart = (row / 3) * 3; int colStart = (col / 3) * 3; f

代码工作,数独求解,但如果你写了几个相同的数字,程序会挂起,不会产生错误,它应该会。请帮忙

class Game
{
    private int[,] puzzle = new int[9, 9];

    public bool isAvailable(int row, int col, int num)
    {
        int rowStart = (row / 3) * 3;
        int colStart = (col / 3) * 3;

        for (int i = 0; i < 9; ++i)
        {
            if (puzzle[row, i] == num) return false;
            if (puzzle[i, col] == num) return false;
            if (puzzle[rowStart + (i % 3), colStart + (i / 3)] == num) return false;
        }
        return true;
    }


    public bool fillSudoku(int row, int col)
    {

        if (row < 9 && col < 9)
        {
            if (puzzle[row, col] != 0)
            {
                if ((col + 1) < 9) return fillSudoku(row, col + 1);
                else if ((row + 1) < 9) return fillSudoku(row + 1, 0);
                else return true;
            }
            else
            {
                for (int i = 0; i < 9; ++i)
                {
                    if (isAvailable(row, col, i + 1))
                    {
                        puzzle[row,col] = i + 1;

                        if (fillSudoku(row, col)) return true;
                        else puzzle[row,col] = 0;
                    }
                }
            }
            return false;
        }
        else return true;
    }

    public void checkSolutions()
    {
        if (!fillSudoku(0, 0))
        {
            Console.Write("\n\nNow Solutions\n\n");
        }
    }

}

fullcode:

因此,您陷入一个紧密循环的原因在于以下几行代码

if (fillSudoku(row, col)) return true;
    else puzzle[row,col] = 0;
这里,您假设您得到的输入总是有效的

在数独开始时调用isValid函数可能是个好主意,这样可以更快地消除重复项

-下面是后来添加的。 调用作为你的数独游戏的第一行是有效的 请根据需要进行优化

    public int isThisValid(int[] oneGroup) {
        // return 0 for invalid
        // return 1 for valid but incomplete
        // return 2 for valid and complete.    

        boolean isFilled[] = new boolean[9];
        for(int i = 0; i < 9; i++) {
            int num = oneGroup[i];
            if(isFilled[num] == true) {
                // duplicate - bailout.                
                return 0;
            }
            // else fill the spot
            isFilled[num] = true;
        }
        for(int i = 0; i < 9; i++) {
            if(isFilled[i] == false) {
                return 1;
            }
        }
        return 2;
    }

    // check for validity
    // empty is allowed.
    public boolean isValid()
    {

        for( int row = 0; row < 9; row++) {
            if(!isRowValid(row)) return false;
        }

        for( int col = 0; col < 0; col++) {
            if(!isColValid(col)) return false;
        }

        for( int boxNo = 0; boxNo < 9; boxNo++) {

            if(!isBoxValid(boxNo)) return false;
        }
        return true;
    }

    public boolean isRowValid(int rowNum) {

        int[] row = new int[9];
        for( int i = 0 ; i < 9; i++ ) {
            row[i] = puzzle[rowNum][i];
        }
        int isValid = isThisValid(row);
        return (isValid == 0);

    }
    public boolean isColValid(int colNum) {
        int[] cols = new int[9];
        for( int i = 0 ; i < 9; i++ ) {
            cols[i] = puzzle[i][colNum];
        }
        int isValid = isThisValid(cols);
        return (isValid == 0);
    }

    public boolean isBoxValid(int boxNum) {
        // please do needful here :)
        return true;
    }

添加前添加检查,没有错误

public bool isAvailable(int row, int col, int num)
        {
            int rowStart = (row / 3) * 3;
            int colStart = (col / 3) * 3;

            for (int i = 0; i < 9; ++i)
            {
                if (puzzle[row, i] == num) return false;
                if (puzzle[i, col] == num) return false;
                if (puzzle[rowStart + (i % 3), colStart + (i / 3)] == num) return false;
            }
            return true;
        }

你试过调试它吗?试过了,我还是不明白为什么和这里的地址。如果你在你的fillSudoku方法中使用fillsukurow,col,你可能会进入一个无限循环。但是如果一切都很好,并且数字的排列是正确的,那么就没有循环了。你正在执行递归调用。你正在调用fillSudoku中的fillSudoku,而fillSudoku又称为fillSudoku,等等。。作为fillSudoku中的第一条语句,添加Debug.WriteLinefillSudoku,并使用+row.ToString++col.ToString调用;看看发生了什么,我一点也不明白。插入的具体内容和位置?对不起,应该在isBoxValid块中?isBoxValid是您需要在与isRowValid和isColValid类似的行中写入的内容
public bool isAvailable(int row, int col, int num)
        {
            int rowStart = (row / 3) * 3;
            int colStart = (col / 3) * 3;

            for (int i = 0; i < 9; ++i)
            {
                if (puzzle[row, i] == num) return false;
                if (puzzle[i, col] == num) return false;
                if (puzzle[rowStart + (i % 3), colStart + (i / 3)] == num) return false;
            }
            return true;
        }
if (isAvailable(x - 1, y - 1, num))
{
     puzzle[x - 1, y - 1] = num;
}
else
{
     Console.WriteLine("ERROR");
}