Algorithm 恩琴真的在回溯吗?

Algorithm 恩琴真的在回溯吗?,algorithm,data-structures,backtracking,n-queens,Algorithm,Data Structures,Backtracking,N Queens,这是一个著名的例子。在阅读了之后,我尝试了下面的代码片段 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

这是一个著名的例子。在阅读了之后,我尝试了下面的代码片段

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
    }
}
然而,当我对回溯的陈述进行评论时,我得到的是相同的,没有任何问题

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;
    }
}
究竟是什么让恩琴问题成为了一个倒退的问题

这不是一种简单的递归方法吗

溶胶[k]=0不是回溯部分。回溯在递归调用中完成:if Nqueenk+1,sol,N

回溯的想法是一种彻底的搜索——你试图搜索所有的可能性,直到找到一个。在这里,你正在尝试所有可能的任务,女王在董事会,并继续如果它仍然是安全的。如果您发现它不安全,您将从递归返回失败,并尝试下一个选项

我相信注释掉的行只确保如果找不到解决方案,则生成的数组是[0,…,0],而不是某个非感测数组。

sol[k]=0不是回溯部分。回溯在递归调用中完成:if Nqueenk+1,sol,N

回溯的想法是一种彻底的搜索——你试图搜索所有的可能性,直到找到一个。在这里,你正在尝试所有可能的任务,女王在董事会,并继续如果它仍然是安全的。如果您发现它不安全,您将从递归返回失败,并尝试下一个选项


我相信注释掉的行只会确保如果找不到解决方案,结果数组是[0,…,0],而不是某个非感测数组。

首先,您确实需要了解算法,这会告诉您,注释掉这些内容并不重要。正如您所注意到的,这个算法是递归的。这是回溯,因为你

将第k个皇后设置为一个位置 探索皇后k+1,k+2,。。。 然后你回到第k个皇后,把它放在别的地方,然后重复
看,在第三步中,我们回到第k女王。这就是我解释为什么它被称为回溯的方式。

首先,你真的需要理解算法,这会告诉你,把那些东西注释掉并不重要。正如您所注意到的,这个算法是递归的。这是回溯,因为你

将第k个皇后设置为一个位置 探索皇后k+1,k+2,。。。 然后你回到第k个皇后,把它放在别的地方,然后重复
看,在第三步中,我们回到第k女王。这就是我如何解释为什么称之为回溯的原因。

回溯问题是一种编程范例,您可以尝试各种可能的组合。然后,对于每个组合,检查到目前为止的组合是否正确。 下面是解决Nor 8皇后问题的几个步骤

从第0行开始,将第一个皇后放置在第0列。 现在将第二女王放置在第1排和第0列。 检查位置是否安全 如果不安全,将第二女王放置在第1排第1列。 不安全,现在将第二女王放置在第1排第2列。 继续这样做,将皇后放置在每个可能的柱上,并检查是否安全。 您可以忽略明显的错误条件,就像您不会在同一行中放置两个皇后一样。 下面是我的8皇后问题代码,打印所有可能的解决方案

#include<stdio.h>


int abs(int a){
        return a>0? a : -a;
}

int isSafe(int col[],int row){
        int row2,col2,i,yDiff,xDiff;
                if(row == 0) return 1;


    for(row2=0;row2<row;row2++){
                    if(col[row2] == col[row])
                            return 0;

                    xDiff = col[row2] - col[row];
                    xDiff = abs(xDiff);
                    yDiff = row - row2;
                    if(xDiff == yDiff)
                                    return 0;
            }

    return 1;

回溯问题是一种编程范例,您可以尝试每种可能的组合。然后,对于每个组合,检查到目前为止的组合是否正确。 下面是解决Nor 8皇后问题的几个步骤

从第0行开始,将第一个皇后放置在第0列。 现在将第二女王放置在第1排和第0列。 检查位置是否安全 如果不安全,将第二女王放置在第1排第1列。 不安全,现在将第二女王放置在第1排第2列。 继续这样做,将皇后放置在每个可能的柱上,并检查是否安全。 您可以忽略明显的错误条件,就像您不会在同一行中放置两个皇后一样。 下面是我的8皇后问题代码,打印所有可能的解决方案

#include<stdio.h>


int abs(int a){
        return a>0? a : -a;
}

int isSafe(int col[],int row){
        int row2,col2,i,yDiff,xDiff;
                if(row == 0) return 1;


    for(row2=0;row2<row;row2++){
                    if(col[row2] == col[row])
                            return 0;

                    xDiff = col[row2] - col[row];
                    xDiff = abs(xDiff);
                    yDiff = row - row2;
                    if(xDiff == yDiff)
                                    return 0;
            }

    return 1;
int Nqueen(int col[],int n, int row){
        int i;
        if(row==n){
                printf("\n");
                for(i=0;i<n;i++)
                        printf("%d ",col[i]+1);

        }else{
                for(i=0;i<n;i++){
                    col[row] = i;
                    if(isSafe(col,row)){
                            queen(col,n,row+1);
                    }

            }
    }
int main(){
        int col[8];
        queen(col,8,0);

}