Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 困难数独游戏的回溯算法超时_C#_Algorithm_Sudoku - Fatal编程技术网

C# 困难数独游戏的回溯算法超时

C# 困难数独游戏的回溯算法超时,c#,algorithm,sudoku,C#,Algorithm,Sudoku,这是我的回溯逻辑代码 private void backtrackLogic() { if (m == 0 && n != 0) { n--; m = 8; if(sudokuArray[n, m] == 0) { counter = copyArray[n, m]; copyArra

这是我的回溯逻辑代码

private void backtrackLogic()
    {
       if (m == 0 && n != 0)
        {
            n--;
            m = 8;
            if(sudokuArray[n, m] == 0)
            {
                counter = copyArray[n, m];
                copyArray[n, m] = 0;
                if(counter == 9)
                {
                    backtrackLogic();
                }
            }
            else
            {
                backtrackLogic();
            }
        }
        else if (m != 0)
        {
            m--;
            if (sudokuArray[n, m] == 0)
            {
                counter = copyArray[n, m];
                copyArray[n, m] = 0;
                if (counter == 9)
                {
                    backtrackLogic();
                }
            }
            else
            {
                backtrackLogic();
            }
        }
        else
        {
            Environment.Exit(0);
        }
    }
这是我对其余算法的代码

private void SolveButton_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 9; j++)
            {
                copyArray[i, j] = sudokuArray[i, j];
                Console.Write(sudokuArray[i, j]);
            }
        }

        counter = 1;
        bool noOptions = false;
        for (n = 0; n < 9; n++)
        {
            for (m = 0; m < 9; m++)
            {
                for (counter = 1; counter < 10; counter++)
                {
                    if (sudokuArray[n, m] == 0)
                    {
                        if (checkRow(n, m, counter) && checkColumn(n, m, counter) && checkBox(n, m, counter))
                        {
                            copyArray[n, m] = counter;
                            printTextBox(n, m, counter);
                            Console.Write(counter);
                            break;
                        }
                        else if (counter == 9)
                        {
                            noOptions = true;
                        }
                    }
                    if (noOptions)
                    {
                        backtrackLogic();
                        noOptions = false;
                    }
                }
            }
        }
        for (int n = 0; n < 9; n++)
        {
            for (int m = 0; m < 9; m++)
            {
                Console.Write(copyArray[n, m]);
            }
        }
    }
private void SolveButton\u单击(对象发送者,路由目标)
{
对于(int i=0;i<9;i++)
{
对于(int j=0;j<9;j++)
{
copyArray[i,j]=sudokuArray[i,j];
Console.Write(sudokuArray[i,j]);
}
}
计数器=1;
bool noOptions=false;
对于(n=0;n<9;n++)
{
对于(m=0;m<9;m++)
{
用于(计数器=1;计数器<10;计数器++)
{
if(sudokuArray[n,m]==0)
{
if(选中行(n,m,计数器)和选中列(n,m,计数器)和复选框(n,m,计数器))
{
copyArray[n,m]=计数器;
打印文本框(n、m、计数器);
控制台。写入(计数器);
打破
}
否则如果(计数器==9)
{
noOptions=正确;
}
}
如果(中午)
{
回溯逻辑();
noOptions=假;
}
}
}
}
对于(int n=0;n<9;n++)
{
对于(int m=0;m<9;m++)
{
Write(copyArray[n,m]);
}
}
}

当在困难的数独问题上运行这段代码时,程序会超时,因为它需要执行多长时间。算法执行过程中的任何帮助都将非常有用

什么是困难的数独问题?我在网上找到了一些预先制作的谜题。该算法解决了标为“容易”的难题,但并不困难。我认为一个普遍的经验法则是,更简单的谜题也会填更多的数字@Shaharyarad就是它粘在上面的那个。你所说的超时是什么意思,程序没有响应?400000805 030000000000700000 020000060 000080400 000010000603070 500200000 104000000是的,程序运行大约一分钟后就没有响应了@Shaharyar@TheSweds您的示例有太多未填充的单元格,这就是简单的回溯算法无法正常工作的原因。您还需要一些其他技术,如前向检查和最小剩余值启发式。你可以找到更多关于彼得·诺维格的信息。