C语言中的回溯
我听说过回溯,我也做过一些搜索。我以为我有了这个想法,并编写了这段代码来解数独,但它似乎给出了错误的解(例如连续重复的数字),我到底做错了什么C语言中的回溯,c,algorithm,sudoku,C,Algorithm,Sudoku,我听说过回溯,我也做过一些搜索。我以为我有了这个想法,并编写了这段代码来解数独,但它似乎给出了错误的解(例如连续重复的数字),我到底做错了什么 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define N 9 bool not_in_row(int temp , int i , int grid[N][N]){ int f ; for(f = 0 ; f < N ; f
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 9
bool not_in_row(int temp , int i , int grid[N][N]){
int f ;
for(f = 0 ; f < N ; f++)
if(grid[i][f] == temp)
return false ;
return true ;
}
bool not_in_column(int temp , int j , int grid[N][N]){
int f ;
for(f = 0 ; f < N ; f++)
if(grid[f][j] == temp)
return false ;
return true ;
}
bool not_in_sq(int i , int j , int grid[N][N] , int temp){
int k , t ;
int s = i - (i % 3) + 3, v = j - (j % 3) + 3;
for(k = i - (i % 3) ; i < s ; i++)
for(t = j - (j % 3) ; j < v ; j++)
if(grid[k][t] == temp)
return false ;
return true ;
}
bool sudoku_Solver(int grid[N][N] , int position){
if(position == 81)
return true ;
int i = position / 9 , j = position % 9 ;
if(grid[i][j] != 0)
return sudoku_Solver(grid , position + 1) ;
else{
int temp ;
for(temp = 1 ; temp <= N ; temp++){
if(not_in_row(temp , i , grid) && not_in_column(temp , j , grid) && not_in_sq(i , j , grid , temp))
{
grid[i][j] = temp ;
if(sudoku_Solver(grid , position + 1))
return true ;
}
}
}
grid[i][j] = 0 ;
return false ;
}
int main(int argc, char *argv[]) {
int i , j ;
int grid[9][9] = {{0,1,0,0,4,0,0,0,0}
,{6,0,0,0,0,0,0,1,8}
,{0,0,0,1,0,9,0,3,2}
,{2,0,5,0,0,3,8,0,0}
,{0,0,0,0,0,0,0,0,0}
,{0,0,4,7,0,0,1,0,5}
,{8,6,0,2,0,5,0,0,0}
,{4,2,0,0,0,0,0,0,9}
,{0,0,0,0,3,0,0,7,0}
} ;
sudoku_Solver(grid , 0) ;
for(i = 0 ; i < 9 ; i++){
for(j = 0 ; j < 9 ; j++){
printf("%d " , grid[i][j]) ;
}
printf("\n") ;
}
return 0;
}
#包括
#包括
#包括
#定义n9
bool not_在行中(int temp、int i、int grid[N][N]){
int f;
对于(f=0;f 对于(temp=1;temp您的not_in_sq
循环错误:
for(k = i - (i % 3) ; i < s ; i++)
for(t = j - (j % 3) ; j < v ; j++)
你能再精确一点吗?什么是“错”关于解决方案?你能显示输出吗?你能解释一下你期望的结果吗?它只是给出了错误的解决方案,例如一行中的重复数字。解决Suduko比这更复杂。例如,两个3/3框在两行中可能有两种可能性。因此,第三个框将有该数字。该数字的位置可能需要si相似的逻辑。这不是本书所要考虑的algorithm@EdHeal是的。算法确实接受它找到的第一个解,但除此之外,如果有解,它会找到它。@EdHeal纯粹主义者会告诉你,如果它没有唯一的解,它就不是数独。(但我认为这是基于词源谬误和关于这个名字起源的神话的结合。)
for(k = i - (i % 3) ; k < s ; k++)
for(t = j - (j % 3) ; t < v ; t++)