C++ 代码
遍历法一:
#include <iostream>
using namespace std;
const int N = 20;
int n;
char map[N][N];
// 记录行、列、对角线、反对角线有没有放置皇后
bool x[N], y[N], l[N], ul[N];
void dfs(int x1, int y1, int k)
{
//选择格子放置皇后的规则: 从左到右, 从上到下
if(y1 == n)
{
x1 ++;
y1 = 0;
}
//走完全图
if(x1 == n)
{
//存放完了n个皇后
if(k == n)
{
for(int i = 0; i < n; i++) puts(map[i]);
cout << endl;
}
return ;
}
//该格子不存放皇后
dfs(x1, y1 + 1, k);
//该格子存放皇后
if(!x[x1] && !y[y1] && !l[x1 + y1] && !ul[y1 - x1 + n])
{
map[x1][y1] = 'Q';
x[x1] = true;
y[y1] = true;
l[x1 + y1] = true;
ul[y1 - x1 + n] = true;
dfs(x1, y1 + 1, k + 1);
//回滚
map[x1][y1] = '.';
x[x1] = false;
y[y1] = false;
l[x1 + y1] = false;
ul[y1 - x1 + n] = false;
}
}
int main()
{
cin >> n;
//初始化地图
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) map[i][j] = '.';
//从第0行0列开始枚举皇后, 枚举到第0个皇后
dfs(0, 0, 0);
return 0;
}
遍历法二:
#include <iostream>
using namespace std;
const int N = 20;
int n;
char map[N][N];
//记录这一列、对角线、反对角线有没有存放皇后
bool g[N], l[N], ul[N];
void dfs(int x)
{
//存放到n+1个皇后, n皇后枚举完成, 打印
if( x >= n + 1 )
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++) printf("%c",map[i][j]);
cout << endl;
}
cout << endl;
return ;
}
//找到可以存放皇后的位置
for(int y = 1; y <= n; y++)
{
//列、对角线、反对角线没有被存放皇后
if(!g[y] && !l[x + y] && !ul[y - x + n])
{
//存放皇后并记录
map[x][y] = 'Q';
g[y] = true;
l[x + y] = true;
ul[y - x + n] = true;
//枚举下一个皇后的位置
dfs(x + 1);
//回滚数据
map[x][y] = '.';
g[y] = false;
l[x + y] = false;
ul[y - x + n] = false;
}
}
}
int main()
{
cin >> n;
//初始化棋盘
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
map[i][j] = '.';
//从第一行开始搜索
dfs(1);
return 0;
}