n皇后非递归求解
#include <iostream>
#include<cmath>
using namespace std;
#define N 4
int x[N];
int Place(int k)
{
for(int i=0;i<k;i++)
{
if(x[i]==x[k]||abs(i-k)==abs(x[i]-x[k])) //约束条件不在同一行(那是必然)不在同一列也不再同对角线上
return 1;
else
return 0;
}
}
void queen()
{
for(int i=0;i<N;i++)
{
x[i]=-1;
}
int k=0,count=0;
while(k>=0)
{
x[k]=x[k]+1;//第一个皇后放了哈,就先给你放在第一个
while(x[k]<N && Place(k)==1)
{
x[k]=x[k]+1;
}//看看违反约束条件没
if(x[k]<N)
{
if(k==N-1)
{
cout<<"plan "<<++count<<endl;//到了最后一个皇后了,可以出第一个方案啦
for(int i=0;i<N;i++)
{
cout<<x[i]+1<<" ";
}
cout<<endl;
}
else//皇后们别急一个个来
k=k+1;
}
else//倒霉的皇后没找到位置,跟上一个皇后商量一下
{
x[k]=-1;
k=k-1;
}
}
}
int main()
{
queen();
return 0;
}