用递归和回溯,重点是回溯要先把皇后位置放好,也就是假设皇后可以在这个位置,再去判断这个位置是否可以放,如果不行的话刚刚假设的位置将会被下一轮循环替代,如果可行则进入递归。
#include<cmath>
#include<iostream>
using namespace std;
#define M 20
int n;
int p1[M] = {0};
int p2[M] = {0};
int qi[M][M];
int sum = 0 ;
int pd1(int h)
{
for(int i=0;i<h;i++)
{
if((p1[i] == p1[h])||(abs(h-i) == abs(p1[i] - p1[h])))
return 0;
}
return 1;
}
int pd2(int h)
{
for(int i=0;i<h;i++)
{
if((p2[i] == p2[h])||(abs(h-i) == abs(p2[i] - p2[h])))
return 0;
}
return 1;
}
void fang2(int h)
{
if(h == n)
sum++;
for(int i=0;i<n;i++)
{
if(p1[h] == i)
continue;
if(qi[h][i] == 0)
continue;
p2[h] = i;
if(pd2(h))
fang2(h+1);
}
}
void fang1(int h)
{
if(h == n)
fang2(0);
for(int i=0;i<n;i++)
{
if(qi[h][i] == 0)
continue;
p1[h] = i;
if(pd1(h))
fang1(h+1);
}
}
int main()
{
cin >> n;;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cin >> qi[i][j];
}
fang1(0);
cout << sum;
return 0;
}
没有一点思路可以看这篇文章,讲的很详细:参考文章