这里介绍一下大致思路:
1、最朴素的想法是一个一个空来猜,直到最后猜出整个解。这时可能你会疑问,一个空9个可能数,会不会回溯太多次?其实不需要太多次,就会出现矛盾。
2、我们定义了一个检查可能数是否与行列、宫格存在数字冲突的函数check,寻空函数findEmpty,解决问题函数solveSudoku,显示结果函数showResult
网上可以找到的解法中,大多使用的是递归,这里就随便提供一个非递归的解法。
数据输入格式如:
3 8 0 0 4 0 0 0 0
0 0 0 8 0 2 0 0 0
5 0 2 0 7 0 0 9 0
9 0 5 0 0 0 0 0 0
0 2 8 0 0 0 6 3 0
0 0 0 0 0 0 2 0 4
0 7 0 0 1 0 5 0 3
0 0 0 3 0 4 0 0 0
0 0 0 0 9 0 0 6 1
#include <cstdio>
#include <stack>
int m[9][9];
bool check(int x, int y, int n) { //检查x行,y列、宫格是否存在数字n,存在则返回真
for (int i = 0; i < 9; ++i) //检查行列
if (m[x][i] == n || m[i][y] == n) return true;
for (int i = 3 * (x / 3); i < 3 * (x / 3) + 3; ++i) //检查宫格
for (int j = 3 * (y / 3); j < 3 * (y / 3) +