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您的示例有太多未填充的单元格,这就是简单的回溯算法无法正常工作的原因。您还需要一些其他技术,如前向检查和最小剩余值启发式。你可以找到更多关于彼得·诺维格的信息。