C++ 如何在这个8皇后算法中进一步进行?
代码和输出在回溯之前运行良好,但我无法继续回溯。取消铺贴后要做什么?它是在回溯之前给出前4个皇后的输出的唯一方法C++ 如何在这个8皇后算法中进一步进行?,c++,c,backtracking,C++,C,Backtracking,代码和输出在回溯之前运行良好,但我无法继续回溯。取消铺贴后要做什么?它是在回溯之前给出前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]; i
#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";
}
#包括
#包括
使用名称空间std;
intrecu(inti,intk);
无效地点(int i,int k);
无效取消配置(int i、int k);
int q[8][8];;
int行[8];
int列[8];
INTC[15];
int d[15];
int totalqueens=0;
int-s;
int main()
{
对于(int i=0;i当未放置所有皇后且无法放置另一个皇后时,返回。返回如下:
看看最后一个放置的皇后是否可以放置在以后的位置。如果可以,请将其放置在那里并停止回溯。(继续放置。)
移除最后一位皇后
如果没有皇后了,停下来。所有的解决方案都找到了
转到步骤1
您的代码只给出一个解决方案。
u r未将输出部件放在正确的位置
试着这样做:
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<<")";
}
}
}
}
记住,不要使用后藤句子。它很难看,可能会引起未知的问题
if(totalqueens==8)
{
print();
return;
}