1.N皇后问题
回溯法,递归法,深度优先
//N皇后问题
#include<iostream>
#include<math.h>
using namespace std;
#define N 20 //皇后的数量
int q[N]; //各行皇后所在的列
int count = 0; //统计N皇后问题解的个数
void prints(int n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(q[i]!=j) cout<<"x";
else cout<<"O";
}
cout<<endl;
}
count++;
}
int isSafe(int k,int j)
{
for(int i=1;i<k;i++)
{
if(q[i]==j||abs(i-k)==abs(q[i]-j))
{
return 0;
}
}
return 1;
}
void n_queens(int k, int n)//k表示从第几行查找,n表示有几个皇后
{
int i=1;
if(k>n) prints(n);//递归结束
else
{
for(int i=1;i<=n;i++)
{
if(isSafe(k,i))
{
q[k]=i;
n_queens(k+1,n);
}
}
}
}
int main()
{
int n;
printf("请输入皇后个数:");
scanf("%d", &n);
n_queens(1, n);
printf("共有 %d 种不同的排列", count);
return 0;
}
2.2N皇后问题
**特别注意变量n为全局变量,在外面定义
#include<iostream>
#include<math.h>
using namespace std;
//N皇后问题
#define N 20 //皇后的数量
int qw[N] = {0};
int qb[N] = {0}; //各行皇后所在的列
int ans = 0; //统计N皇后问题解的个数
int a[9][9] = {0};
int n;
int isSafeW(int k, int j)
{
for (int i = 1; i < k; i++)
{
if (qw[i] == j || abs(i - k) == abs(qw[i] - j) )
{
return 0;
}
}
return 1;
}
int isSafeB(int k, int j)
{
for (int i = 1; i < k; i++)
{
if (qb[i] == j || abs(i - k) == abs(qb[i] - j))
{
return 0;
}
}
return 1;
}
void b_queens(int k)//k表示从第几行查找,n表示有几个皇后
{
if (k > n)
{
ans++;//递归结束
}
else
{
for (int i = 1; i <= n; i++)
{
if (a[k][i] == 0 || i == qw[k]) continue;
else if (isSafeB(k, i))
{
qb[k] = i;
b_queens(k + 1);
}
}
}
}
void w_queens(int k)//k表示从第几行查找,n表示有几个皇后
{
if (k > n)
{
b_queens(1);//递归结束
return;
}
else
{
for (int i = 1; i <= n; i++)
{
if (a[k][i] == 0 ) continue;
else if (isSafeW(k, i))
{
qw[k] = i;
w_queens(k + 1);
}
}
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
cin >> a[i][j];
}
w_queens(1);
cout << ans;
return 0;
}