2015-04-22 39 views
-2

我必須製作一個n×n的數獨求解器。用戶輸入n,然後輸出是一個解決的數獨謎題。我做了它的大部分,但我一直在分段錯誤。任何幫助將不勝感激。 我認爲這與我的遞歸函數有關。在C++中用Sudoku實現Segmenation Fault

int findValues(int** sudoku, int size, int a[], int r, int c) 
{ 
    int n=0; 
    int i,j; 
    int s=(int)(sqrt(size)); 
    int b[size+1]; 
    memset(b,0,size*size*sizeof(int)); 

    //checks numbers in row 
    for(i=0; i<size; i++) 
     b[sudoku[r][i]]=1; 

    //checks number in column 
    for(i=0; i<size; i++) 
     b[sudoku[i][c]]=1; 

    //checks number in block 
    r=(r/s)*s; 
    c=(c/s)*s; 
    for(i=r; i<r+s; i++) 
     for(j=c; j<c+s;j++) 
      b[sudoku[i][j]]=1; 

    //Fill array a[] with no.s disappeared in current row, column and block 
    for(i=1;i<=size; i++) 
     if(!b[i]) 
      a[n++]=i; 

    return n; 
} 

//Function to solve the sudoku board 
void Solve(int size, bool &stop) 
{ 
    int** sudoku; 
    sudoku=new int*[size]; 
    for(int z=0; z<size; z++) 
     sudoku[z] = new int[size]; 

    int i,j; 
    int a[size+1]; 
    memset(a,0,size*size*sizeof(int)); 
    int n=0; 

    if(stop) //true if user does not want more solutions 
     return; 

    if(isFull(sudoku, size)) //true if now sudoku board is solved completely 
    { 
     //shows the solution   
     displaySolution(sudoku, size); 
     char more; 
     cout << "Press 0 for 'END'\n"; 
     cin >> more; 

     if(more != '1') 
      stop = true; 
     return;//so that only one solution will appear, and it does not  continuously repeat  
    } 

    //to find empty place 
    int y = 0; 
    for(i=0;i<size;i++) 
    { 
     for(j=0;j<size;j++) 
      if(!sudoku[i][j]) 
      { 
       y = 1; 
       break; 
      } 
     if(y) 
      break; 
    } 

    //check all values at that place 
    n = findValues(sudoku, size, a, i, j); 
    for(int l=0;l<n;l++) 
    { 
     //put value at vacant place 
     sudoku[i][j]=a[l]; 
     //now solve the updated board 
     Solve(size, stop); 
    } 

    sudoku[i][j]=0; 
} 
+0

你能否給我們提供一些我們可以立即編譯和運行的代碼(包括main和stuff)。但是通過查看代碼,在第7行的memset中,b的大小(大小+ 1),但您將它視爲大小(大小*大小) –

+0

int s =(int)(sqrt(size ));這對我來說很腥,一個9x9的數獨在你的程序中有9或81的大小?你還在使用回溯還是你想要做什麼? – maraca

+0

呃。你的變量名傷害了我的眼睛:) –

回答

1
int a[size+1]; 
memset(a,0,size*size*sizeof(int)); 

這將導致一個段錯誤。您正在將大小平方的內存清理爲正常大小的數組。

此外,您還可以創建數獨板時創建的所有內存泄漏。你的尺寸+ 1的東西也感覺很不好,不需要。