如何在这个 8 皇后算法中进一步推进?

Posted

技术标签:

【中文标题】如何在这个 8 皇后算法中进一步推进?【英文标题】:How to proceed further in this 8 queen algorithm? 【发布时间】:2012-12-28 21:38:49 【问题描述】:

代码和输出在回溯之前工作正常,但我无法继续回溯。拆线后怎么办?它只是在回溯之前给出前 4 个皇后的输出。

    #include <iostream>
    #include <conio.h>
    using namespace std;
    int recu(int i,int k);
    void place(int i,int k);
    void unplace(int i,int k);
    int q[8][8];
    int row[8];
    int column[8];
    int c[15];
    int d[15];
    int totalqueens=0;
    int s;

    int main()
    
        for(int i=0;i<8;i++) //Flags for rows,columns and diagonals
        
        row[i]=0;
        column[i]=0;
        c[i]=0;d[i]=0;
        
        for(int i=8;i<15;i++)
        
        c[i]=0;d[i]=0;
        
        int i=0;
        int k=0;
        recu(i,k);


      for(int i=0;i<8;i++)
      
          for(int k=0;k<8;k++)
          
                if(q[i][k]==1)
                
                   cout<<"(";
                   cout<<i;
                   cout<<",";
                   cout<<k;
                   cout<<")";
                
           
     

    getch();
    return 0;


int recu(int i,int k)
 
     if(totalqueens==8)
       goto print; 
     if(k<8)
      
          if(column[i]==0 && row[k]==0 && c[i+k]==0 && d[i-k+7]==0)
           
             place(i,k);

             s=k;
             k=0;
             recu(i+1,k);
           
           else
            
             recu(i,k+1);
             unplace(i-1,s);
            //**I am not able to proceed further**
           

      

print:
    ;


void place(int i,int k)
     
    totalqueens++;
    q[i][k]=1;
    row[k]=1;
    column[i]=1;
    c[i+k]=1;
    d[i-k+7]=1;


void unplace(int i,int k)

    q[i][k]=0;
    row[i]=0;
    column[k]=0;
    c[i+k]=0;
    d[i-k+7]=0;
    //cout<<"before call";
    recu(i,k+1);
    //cout<<"working";

【问题讨论】:

【参考方案1】:

您的代码只给出了一种解决方案。 你没有把输出部分放在正确的地方。

试试这样:

void print()

      for(int i=0;i<8;i++)
      
          for(int k=0;k<8;k++)
          
                if(q[i][k]==1)
                
                   cout<<"(";
                   cout<<i;
                   cout<<",";
                   cout<<k;
                   cout<<")";
                
           
     

将其作为一种方法。然后,在您的 recu 方法中,修改为:

if(totalqueens==8)

    print();
    return;

请记住,不要使用 goto 语句。它非常丑陋,可能会导致未知问题。

【讨论】:

【参考方案2】:

当尚未放置所有皇后并且您无法放置另一个皇后时,您会回溯。你回溯如下:

    查看最后放置的皇后是否可以放在后面的位置。如果是这样,请将其放在那里并停止回溯。 (继续放置。)

    移除最后放置的皇后。

    如果没有皇后,请停止。已找到所有解决方案。

    转到步骤 1。

【讨论】:

以上是关于如何在这个 8 皇后算法中进一步推进?的主要内容,如果未能解决你的问题,请参考以下文章

算法学步:回溯法-8皇后问题

八皇后问题Python实现

程序设计与算法算法基础》《第二周 递归》N皇后问题

求解八皇后问题的退火算法

如何在调用堆栈中进一步提取有关分配的信息?

8皇后算法