C# 递归编程:跳转到代码中的上一步
C# recursive programming: jump onto previous step in code
我接到了编写数独程序的任务,该程序解决了数独维基百科示例。
解决数独难题的方法必须是递归方法。
它首先检查数独板是否有效(数独规则:同一行、同一列和同一框中没有两次出现的数字),然后获取它可以写入的第一个空字段,并将第一个值(数字 1)写入字段。之后,该方法再次调用自身(递归)。
我的方法是这样的:
private bool SolveSudoku(int[,] board)
{
// if board not valid, return false
if (!CheckBoardValid(board))
{
return false;
}
// if board full, return true
var nextField = GetFirstEmpty(board);
if (nextField is null)
{
return true;
}
for (int value = 1; value < 10; value++)
{
board[nextField.Value.X, nextField.Value.Y] = value;
var solved = SolveSudoku(board);
// if solved, do nothing
// if not solved, undo this step and try writing next number (value++) in field
}
return false;
}
如果最后一步无效,我该如何撤消?
截取相关部分:
for (int value = 1; value < 10; value++)
{
board[nextField.Value.X, nextField.Value.Y] = value;
if(SolveSudoku(board)) return true;
// ^^ Stop if solved,
// iteration will increase value if not.
}
// reset and return false if no value for this field leads to a solution.
board[nextField.Value.X, nextField.Value.Y] = 0;
return false;
我接到了编写数独程序的任务,该程序解决了数独维基百科示例。 解决数独难题的方法必须是递归方法。 它首先检查数独板是否有效(数独规则:同一行、同一列和同一框中没有两次出现的数字),然后获取它可以写入的第一个空字段,并将第一个值(数字 1)写入字段。之后,该方法再次调用自身(递归)。
我的方法是这样的:
private bool SolveSudoku(int[,] board)
{
// if board not valid, return false
if (!CheckBoardValid(board))
{
return false;
}
// if board full, return true
var nextField = GetFirstEmpty(board);
if (nextField is null)
{
return true;
}
for (int value = 1; value < 10; value++)
{
board[nextField.Value.X, nextField.Value.Y] = value;
var solved = SolveSudoku(board);
// if solved, do nothing
// if not solved, undo this step and try writing next number (value++) in field
}
return false;
}
如果最后一步无效,我该如何撤消?
截取相关部分:
for (int value = 1; value < 10; value++)
{
board[nextField.Value.X, nextField.Value.Y] = value;
if(SolveSudoku(board)) return true;
// ^^ Stop if solved,
// iteration will increase value if not.
}
// reset and return false if no value for this field leads to a solution.
board[nextField.Value.X, nextField.Value.Y] = 0;
return false;