全排列
#include <iostream>
using namespace std;
int k, n;
int queen[1000];
int x[1000];
void show()
{
for (int i = 1; i <= n; i++)
cout << queen[i];
cout << endl;
}
void dfs(int k)
{
if (k > n)
{
show();
return;
}
else
{
for (int i = 1; i <= n; i++)
{
if (x[i] == 0)
{
queen[k] = i;
x[i] = 1;
dfs(k + 1);
x[i] = 0;
}
}
}
}
int main()
{
cin >> n;
dfs(1);
}
N皇后(递归写法)
#include <iostream>
#include <cmath>
using namespace std;
int queen[100];
int n, ans = 0;
//检验第k行的第i列上是否可以摆放皇后
int check(int k, int i)
{
for (int j = 1; j < k; j++)
{
/*
第一个条件是判断是否在同一列(也可以用visit[i]数组替代);
第二个条件是判断是否在同一斜线上,依据是计算这两个点之间的水平与垂直距离是否相等;
abs(queen[j] - i)是计算当前想插入的点与当前正在检查的点之间的水平距离,k-j 是计算二者之间的垂直距离。
*/
if ((queen[j] == i) || abs(queen[j] - i) == (k - j))
return 0;
}
return 1;
}
void show()
{
for (int i = 1; i <= n; i++)
{
cout << queen[i] << " ";
}
cout << endl;
}
void dfs(int k)
{
int i;
if (k == n + 1)
{
ans++;
show();
return;
}
for (i = 1; i <= n; i++)
{
if (check(k, i)) //也可以在判断条件里加上“visit[i]==0”来检查是否有同意行或列的情况,但这里可以在check函数的for循环里用一个(queen[j] == i)来代替,可以达到同样的效果还减少了visit数组的开辟
{
queen[k] = i;
dfs(k + 1);
}
}
}
//使用全排列的思想解决n皇后问题
int main()
{
cin >> n;
dfs(1);
cout << ans;
}
另外,非递归写法
void Queen(int n)
{
int k = 0, j = 0;
while (k < n)
{
while (j < n)
{
if (check(k, j))
{
queen[k] = j;
j = 0;
break;
}
else
{
j++;
}
}
if (queen[k] == null)
if (k == 0)
break;
else
{
k--;
j = queen[k] + 1;
queen[k] = null;
continue;
}
}
if (k == n - 1)
{
show();
j = queen[k] + 1;
queen[k] = null;
continue;
}
k++;
}
}