c#数独求解器计算导致崩溃

本文关键字:计算 崩溃 | 更新日期: 2023-09-27 17:53:08

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

我的程序的进一步信息:我有一个包含81个TextBox对象的列表,初始数组是使用for循环初始化的,以便将正确的值赋给二维数组中的正确位置。

这个数组随后被传递给递归函数,其中包含对数组的引用以及row和col = 0作为参数(因为c#不会使用未赋值的局部变量进行编译)。我已经调试了程序,检查是否将正确的值赋给了数组中的正确位置,这端没有问题。

同样使用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;
    }

c#数独求解器计算导致崩溃

我找到了问题的根源,但是为什么程序产生错误的结果让我很头疼。显然,我要做的是在每个不同的数独测试中删除tmpRad和tmpKol检查,以产生正确的结果。