个人理解回溯即DFS,利用递归实现相对简单理解,非递归很容易编码混乱
非递归实现:
#include <iostream>
using namespace std;
int queens[8];
int main()
{
int i=0;
while(i<=7)
{
bool condition=true;
for(int j=i-1;j>=0;j--)
{
if(queens[i]==queens[j]||abs(queens[i]-queens[j])==(i-j))
{
condition=false;
}
}
if(condition&&i==7)
{
for(int k=0;k!=8;k++)
{
cout<<queens[k]<<" ";
}
cout<<endl;
}
if(condition&&i<7)
{
i++;
queens[i]=0;
continue;
}
while(queens[i]==7&&i>0)//回溯
{
i--;
}
if(queens[i]==7&&i==0)
{
break;
}
else
{
queens[i]++;
}
}
getchar();
}
递归实现;
#include <iostream>
using namespace std;
int queens[8];
void search(int K)
{
if(K>7)
{
return;
}
for(int i=0;i!=8;i++)
{
queens[K]=i;
bool condition=true;
for(int j=K-1;j>=0;j--)
{
if(queens[K]==queens[j]||abs(queens[K]-queens[j])==(K-j))
{
condition=false;
}
}
if(condition&&K==7)
{
for(int k=0;k!=8;k++)
{
cout<<queens[k]<<" ";
}
cout<<endl;
}
if(condition)
{
search(K+1);
}
}
}
int main()
{
search(0);
getchar();
}