我已經通過使用回溯實現了N皇后問題的解決方案。 我正在檢查每個女王的位置是否安全,方法是檢查它的左上角,右上角和頂部,然後將其放在行中,否則我會回溯。N皇后使用回溯
這是給對於N一些值,比如4,8正確的解決方案,但不正確的人,如6
我不知道我錯過了什麼。任何幫助將不勝感激。
下面的代碼:
int S;
static int cnt=0;
int safepos(int board[][S+1],int i,int j)
{
if(i==1)
return 1;
int a,b;
a=i-1;
b=j-1;
//checking for top-left side
while(a>0 && b>0)
{
if(board[a--][b--]==1)
return 0;
}
a=i-1;
b=j+1;
//checking for top-right side
while(a>0 && b<=S)
{
if(board[a--][b++]==1)
return 0;
}
//checking for the same column
for(a=1;a<i;a++)
if(board[a][j]==1)
return 0;
return 1;
}
void Nqueens(int board[][S+1],int N,int n) //n is the number of the rows
{
if(n==N+1) //for those which reaches the last position we will have a solution
{
cnt++;
return;
}
int i;
for(i=1;i<=N;i++) //for every column
{
if(safepos(board,n,i))
{
board[n][i]=1;
Nqueens(board,N,n+1); //checking for next row
}
board[n][i]=0;
}
}
int main()
{
int N=6;
S=N;
int board[N+1][N+1];
Nqueens(board,N,1);
printf("%d",cnt);
return 0;
}
非常感謝您的幫助 – Luv