簡體   English   中英

C 中的回溯

[英]Backtracking in C

我聽說過回溯,我搜索了一下。我以為我明白了並寫了這段代碼來解決數獨,但它似乎給出了錯誤的解決方案(例如連續重復數字),究竟是什么我在這里做錯了嗎?

#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;
       }

您在not_in_sq中的循環是錯誤的:

for(k =  i - (i % 3) ; i < s ; i++)
    for(t = j - (j % 3) ; j < v ; j++)

仔細觀察i < si++j < vj++ 他們顯然是不正確的。 在這里,它們是固定的:

for(k =  i - (i % 3) ; k < s ; k++)
    for(t = j - (j % 3) ; t < v ; t++)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM