数独问题--求解数独:

求解数独:

首先了解数独规则: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;

}

}

}

 

求解数独也就完成了,文章接下来还会更新,会有命令行执行程序的控制。

posted @ 2018-04-12 22:17  Prisonerr  阅读(321)  评论(0编辑  收藏  举报