-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;
}
你能否給我們提供一些我們可以立即編譯和運行的代碼(包括main和stuff)。但是通過查看代碼,在第7行的memset中,b的大小(大小+ 1),但您將它視爲大小(大小*大小) –
int s =(int)(sqrt(size ));這對我來說很腥,一個9x9的數獨在你的程序中有9或81的大小?你還在使用回溯還是你想要做什麼? – maraca
呃。你的變量名傷害了我的眼睛:) –