C#Sudoku求解器计算结果崩溃

时间:2015-06-03 13:26:02

标签: c# recursion sudoku backtracking

好吧,我用c ++编写了这种程序,并在一秒钟内编译并计算出一个合理的答案,没问题。 我试图将程序翻译成c#,因为我想要带有文本框的漂亮的图形界面,以及我可以在visual studio中使用c#获得的那种。该算法非常相似,但c#版本在程序崩溃之前不会产生结果,我不明白为什么......

我的计划的更多信息: 我有一个81个TextBox对象的列表,初始数组使用for循环进行初始化,以便为二维数组中的正确位置提供正确的值。

然后将此数组传递给递归函数,并引用数组和行,并将col = 0作为参数(因为c#将使用未分配的局部变量进行编译)。我调试了程序,检查是否给出了数组中的rigth位置正确的值,没有问题。

同样在Visual Studio中使用调试器我发现调试器花了大量时间从递归函数的第一个函数调用到下一个函数调用。

快速挪威语指南:rad = row,kol = column。我希望不会出现太多问题。

Main :(这是一个按钮事件触发器)

        private void btnLøs_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        int rad, kol;

        rad = 0; kol = 0;
        int[,] array = new int[9,9];

        for(int i = 0; i < 81;i++)
        {
            int tmpRad = i / 9;
            int tmpKol = i % 9;
            //Celler is the list of textblocks that represents the grid
            if(celler[i].Text == "")
            {

                array[tmpRad, tmpKol] = 0;
            }

            else
                array[tmpRad,tmpKol] = Convert.ToInt32(celler[i].Text);
        }

        LøsSodoku(ref array,rad,kol);

        for(int i = 0; i < 81;i++)
        {
            int tmpRad = i / 9;
            int tmpKol = i % 9;

            array[tmpRad,tmpKol] = Convert.ToInt32(celler[i].Text);

            celler[i].Text = array[tmpRad,tmpKol].ToString();
        }
    }

代码:

private bool gridHarLedigPlass(ref int[,] arr, ref int rad, ref int kol)
 //check if the array has empty cells (cells with 0)    
    {
        for (rad = 0; rad < 9; rad++)
        {
            for (kol = 0; kol < 9; kol++)
            {
                if (arr[rad, kol] == 0)
                {
                    return true;
                }
            }
        }
        return false;
    }

    private bool tallIBox(ref int[,] arr, int startRad, int startKol, int num)
    {
        int tmpRad = startRad, tmpKol = startKol;

        for (int rad = 0; rad < 3; rad++)
        {
            for (int kol = 0; kol < 3; kol++)
            {
                if (rad != tmpRad && kol != tmpKol)
                {
                    if (arr[rad + startRad, kol + startKol] == num)
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private bool tallIRad(ref int[,] arr, int rad, int kol, int num)
    //Check if the num exists in the row
    {
        int tmpRad = rad, tmpKol = kol;

        for (kol = 0; kol < 9; kol++)
        {
            if (rad != tmpRad && kol != tmpKol)
            {
                if (arr[rad, kol] == num)
                {
                    return true;
                }
            }
        }
        return false;
    }

    private bool tallIKolonne(ref int[,] arr, int rad, int kol, int num)
    //Check if the num exists in the column
    {
        int tmpRad = rad, tmpKol = kol;
        for (rad = 0; rad < 9; rad++)
        {
            if (rad != tmpRad && tmpKol != kol)
            {
                if (arr[rad, kol] == num)
                {
                    return true;
                }
            }
        }
        return false;
    }

    private bool erSafe(ref int[,] arr, int rad, int kol, int num)
    //Check if the placement is valid
    {
        return !tallIRad(ref arr, rad, kol, num) && !tallIKolonne(ref arr, rad, kol, num)
            && !tallIBox(ref arr, rad - rad%3, kol - kol%3, num);
    }

    private bool LøsSodoku(ref int[,] arr, int rad, int kol)
    //Recursive backtracking function
    {

        //Check if all cells are filled with numbers
        if (!gridHarLedigPlass(ref arr, ref rad, ref kol))
        {
            return true;
        }

        for (int num = 1; num <= 9; num++)
        {
            if (erSafe(ref arr, rad, kol, num))
            {
                arr[rad, kol] = num;

                if (LøsSodoku(ref arr, rad, kol))
                {
                    return true;
                }

                arr[rad, kol] = 0;
            }
        }
        return false;
    }

1 个答案:

答案 0 :(得分:0)

我找到了问题的根源,但为什么程序产生了错误的结果会伤害我的大脑。 我不得不做的就是在每个不同的数独测试中删除tmpRad和tmpKol检查以产生正确的结果。

现在它就像一个魅力。