求解数独:
首先了解数独规则:9*9网格,同时分成9个九宫格,有固定数字,而我们的任务是将剩余无数字部分填满,达到每一行,每一列,每一个九宫格都没有相同数字的要求。
而如何用计算机进行求解呢?计算机的深度优先搜索(dfs)可以解决这个问题,搜索的时间复杂度规模十分的大,所以在不知道如何进行优化的时候,暴力解决问题也就成了唯一的选择。
我们对搜索的位置进行数字判断,分别对同一个九宫格,同一行同一列27个数字进行judge:
int judge(int num, int ple){
int x = ple / 9;
int y = ple % 9;
int qulx = x / 3;
int quey = y / 3;
for (int i = 0; i < 9; i++){
if (map[x][i] == num){
return 0;
}
}
for (int i = 0; i < 9; i++){
if (map[i][y] == num){
return 0;
}
}
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
if (map[qulx * 3 + i][quey * 3 + j] == num)
return 0;
}
}
return 1;
}
把符合要求的数字进行填入变成条件数字搜索下一个数字,进行回溯,如果递归到82层,也就是前面的81个数字全部满足数独要求,我们就可以把这个数独终局记录下来,成为答案,由于项目只要求一个解,所以当得到一个数独终局时,我们可以设置一个外部变量,以便于跳出递归。具体代码如下:
void getans(int next){
if (temp == 1){
return;
}
if (next == 81){
char lis[600];
temp = 1;
int bi = 0;
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++){
if (j == 0)lis[bi++] = map[i][j] + '0';
else {
lis[bi++] = ' ';
lis[bi++] = map[i][j] + '0';
}
}
lis[bi++] ='\n';
}
lis[bi++] = '\n';
lis[bi] = '\0';
fputs(lis, fp);
return;
}
if (map[next / 9][next % 9] != 0){
getans(next + 1);
return;
}
for (int i = 1; i <= 9; i++){
if (judge(i, next)){
map[next / 9][next % 9] = i;
getans(next + 1);
map[next / 9][next % 9] = 0;
}
}
}
求解数独也就完成了,文章接下来还会更新,会有命令行执行程序的控制。