【发布时间】:2022-09-23 03:15:20
【问题描述】:
这是我的第一篇文章,如果我做错了,我深表歉意。几个月前我开始用 python 编码,现在我已经转向 C#。为了学习回溯,我尝试编写数独求解器。但是,对于我的一生,我无法理解为什么我的代码不起作用。当然,有很多解决方案。我觉得我现在进步的最好方法是了解我在我的个人代码中缺少什么。所以,如果你有时间:
为什么我的代码不会返回一个已解决的数独板?我怀疑错误在于递归。
主程序:
using System;
namespace Sudoku
{
class Program
{
static void Main(string[] args)
{
var sudokuTemplate = new SudokuTemplate();
var sudoku = sudokuTemplate.CreateSudoku();
Print.print(sudoku);
Console.WriteLine();
Print.print(driver(sudoku));
}
static int[,] driver(int[,] board)
{
var check = new ErrorCheck();
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (board[i,j] == 0)
{
for (int n = 1; n <= 9; n++)
{
if (check.legal(board, i, j, n))
{
board[i, j] = n;
driver(board);
}
else
{
board[i, j] = 0;
}
}
return board;
}
}
}
return board;
}
}
}
未解的数独
namespace Sudoku
{
class SudokuTemplate
{
public int[,] CreateSudoku()
{
var array = new int[,]
{
{5,3,0,0,7,0,0,0,0},
{6,0,0,1,9,5,0,0,0},
{0,9,8,0,0,0,0,6,0},
{8,0,0,0,6,0,0,0,3},
{4,0,0,8,0,3,0,0,1},
{7,0,0,0,2,0,0,0,6},
{0,6,0,0,0,0,2,8,0},
{0,0,0,4,1,9,0,0,5},
{0,0,0,0,8,0,0,7,9}
};
return array;
}
}
}
错误检查器查看数字 n 是否可以合法放置在板上:
namespace Sudoku
{
public class ErrorCheck
{
public bool legal(int[,]array, int row, int col, int n)
{ //check col & rw
for (int i = 0; i < 9; i++)
{
if (array[row, i] == n)
{
return false;
}
if (array[i, col] == n)
{
return false;
}
}
//check boxes
int valRow = 0;
if (row < 6 && row > 2)
{
valRow = 3;
}
else if (row < 9 && row > 5)
{
valRow = 6;
}
int valCol = 0;
if (col < 6 && col > 2)
{
valCol = 3;
}
else if (col < 9 && col > 5)
{
valCol = 6;
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (array[(j+valRow), (i+valCol)] == n)
{
return false;
}
}
}
return true;
}
}
}
最后是打印功能:
namespace Sudoku
{
class Print
{
public static void print(int[,] array)
{
// prints sudoku
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
Console.Write(\"{0} \", array[i, j]);
Console.Write(\"|\");
}
Console.WriteLine();
}
}
}
}
编辑:
代码导致打印原始未解决的数独板两次。它最初似乎工作正常,但在某个地方,一切都只是重置为原始未解决的板。
-
您是否遇到了异常,或者只是没有给出正确的结果?
-
我得到错误的结果。该代码将原始未解决的数独打印两次。谢谢,我会在帖子中澄清。
-
您是否尝试过调试并单步执行代码以查看其行为方式?
-
是的,阿斯特丽德我试过了。它最初似乎工作正常。但是在递归循环的某个地方出了点问题。我不得不承认我没有点击整个事情,因为上帝知道这需要多长时间哈哈......