大学时,对数独比较有一点兴趣,后来参加了一次学校组织的数独比赛,可惜结果不佳。最后本程序猿不服,突发奇想,准备自己写一个程序,解决数独问题。
思路也很简单,遍历,每碰到一个空位,则从1到9逐个试探,填完之后先判定所填数字是否有效,然后判断新填完后的数独是否可解。
先来一个函数,判断数独是否有效。代码如下
/*
检测一个数独是否有效,即在行,列,或小九宫格中出现重复数字,空位用-1代替
*/
//bool used[9] 用于记录数字是否出现过
//辅助函数,检测一个数字是否出现过
bool ChechNum(const int num, bool used[9]) { //没出现过返回true,否则返回false
if (num == -1) return true;
if (used[num - 1]) return false;
else {
used[num - 1] = true;
return true;
}
}
bool IsSudoValid(vector<vector<int>>& board) {
bool used[9];
for (int i = 0; i < 9; ++i) {
fill(used, used + 9, false); //初始化辅助数组
for (int j = 0; j < 9; ++j) { //检查行
if (!ChechNum(board[i][j], used))
return false;
}
fill(used, used + 9, false);