算法比较复杂 这里不适合谈论这个算法
简单说说吧
如果我们不谈论程序数据区的开销的话 :(最普遍能想到的 )
我们需要下面的函数
a[M][N]
保存数组 假设0表示未确定
b[M][N]
表示 b[i][j]表示a[i][j]位置上有几个可能的取值
int f1(int a[][N]);返回值表示a[i][j] 位置上有几个可能的取值,返回0表示已经确定该处的值
int * f2(int a[][N]);返回长度为10的数组 指针 ,该数组表示a[i][j]位上所有可能的取值 返回全0 表示该位置确定
void f3(int a[][N],int b[][N]);里面调用f1()逐个计算b[i][j] 该函数主要用来计算当前的b[][];
void f4(int a[][N],int b[][N]);f4()运行之后 首先刷新生成一次 b[][];
里面递归f4(),终止条件是b[][] !=1 ;
否则 全局扫描,如果b[][]==1那么求解 并且根据f3()重新计算b[][];
这里递归f4();
完成f4()之后保证没有一个地方的可能值只有一个。
void f5(int a[][N],int b[][N])就是重点的重点了 这里不做深入讨论,
f5()里面递归调用f5(),终止条件是b[][]全0;
f5()重点采用假设法,可以顺序假设 也可以按照b[][]从小到大 开始假设
假设之后要调用f4(),调用f4()后 根据b[][]决定是不是要递归调用f5();
如果遇到test()==1 就保存记录。如果test()==0 重新假设 并且消除之前被假设过的值
bool test(int a[][N]);
测试填好值的数独 是不是正确解
过程忽略。