如何在这个 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 皇后算法中进一步推进?的主要内容,如果未能解决你的问题,请参考以下文章