NQueen 问题是回溯的一个著名例子。从源代码阅读后,我尝试了以下代码片段。
int isSafe(int k,int i,int *x)
{
int j;
for(j=0;j<k;j++)
{
//old queen is placed at jth row of x[j] column
//new queen to be placed at kth row of ith column
if(i==x[j] || abs(k-j)==abs(i-x[j]))
return 0;
}
return 1;
}
int Nqueen(int k, int* sol, int N)
{
int col;
if( k == N )
{
printSol(sol,N);
return 1;
}
else
{
for(col = 1;col <= N; col++) //determines appropriate column number of the kth queen to be placed
{
if( isSafe(k,col,sol) )
{
sol[k] = col;
if( Nqueen(k+1, sol, N) )
return 1;
sol[k] = 0; // backtrack
}
}
return 0; // solution not possible
}
}
我得到的输出为:
1 5 8 6 3 7 2 4
但是,当我评论回溯的语句时,我会毫无问题地得到相同的输出。
int Nqueen(int k, int* sol, int N)
{
int col;
if( k == N )
{
printSol(sol,N);
return 1;
}
else
{
for(col = 1;col <= N; col++) //determines appropriate column number of the kth queen to be placed
{
if( isSafe(k,col,sol) )
{
sol[k] = col;
if( Nqueen(k+1, sol, N) )
return 1;
// sol[k] = 0; <-------------- Notice this change
}
}
return 0;
}
}
究竟是什么让 NQueen 成为回溯问题?
这不是一个简单的递归方法吗?