N皇后问题。。。emmm,之前写的对角冲突是用for循环检查左对角和右对角,今天看到个用坐标差绝对值的,记一下记一下
这是用一个一维数组表示的,递归求解。那个数组queen[i]=j表示把皇后放到第i行的第j列。
#include<iostream>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int N;
int queen[100];
void Nqueen(int k)
{
int i;
if(k==N)
{
for(i=0;i<N;i++)
cout<<queen[i]+1<<" ";
cout<<endl;
return ;
}
for(i=0;i<N;i++) //代表i从0列开始遍历
{
int j;
for(j=0;j<k;j++)//代表j从0行开始检查,queen[j]代表列
{
//对角冲突条件,假设当前第k行第i列的皇后与第j行第queen[j]列的皇后冲突,
//那么对应行差的绝对值=对应列差的绝对值
if(queen[j]==i||abs(queen[j]-i)==abs(k-j))
{
break;
}
}
if(j==k)
{
queen[k]=i;
Nqueen(k+1);
}
}
}
int main(){
cin>>N;
//memset(queen,0,sizeof(queen));
Nqueen(0);
return 0;
}