//每个格子都看一下放上能不能找到结果
#include<iostream>
using namespace std;
const int N = 20;
int n;//n皇后
char res[N][N];
//该行该列,正对角线,反对角线上有没有皇后
int row[N],column[N],diagonal[N],back_diagonal[N];
void dfs(int x,int y,int s)//x,y横纵坐标从0开始,s皇后个数
{
//找到该行最后一个的下一个,就转到下一行的第一个
if(y == n) y = 0,x ++;
if(x == n)//找到最后一行
{
if(s == n)//皇后数放满1
{
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < n; j ++)cout << res[i][j];
cout << endl;
}
cout << endl;
}
return ;
}
//该格子不放皇后
dfs(x,y + 1,s);
//该格子放皇后
if(!row[x] && !column[y] && !diagonal[y - x + n] && !back_diagonal[y + x])
{
res[x][y] = 'Q';
row[x] = column[y] = diagonal[y - x + n] = back_diagonal[y + x] = true;
dfs(x,y + 1,s + 1);//从下一行第一个开始找
row[x] = column[y] = diagonal[y - x + n] = back_diagonal[y + x] = false;
res[x][y] = '.';
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < n; j ++) res[i][j] = '.';//初始化
}
dfs(0,0,0);
return 0;
}
//每行只放一个,看放在那个格子
#include<iostream>
using namespace std;
const int N = 10;
int n;//n皇后
char res[N][N];
//该列,正对角线,反对角线上有没有皇后
int column[N],diagonal[N],back_diagonal[N];
void dfs(int t)//t是行
{
if(t == n)//说明0——n - 1 行已经放完了,放了n个皇后
{
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < n; j ++) cout << res[i][j];//初始化
cout << endl;
}
cout << endl;
}
for(int i = 0; i < n; i ++)//i是列
{
//正对角线y = x + b;截距b = y - x;可能小于0则令b = y - x + n;
//反对角线y = -x + b;截距b = y + x;
if(!column[i] && !diagonal[t - i + n] && !back_diagonal[t + i])
{
res[t][i] = 'Q';
column[i] = diagonal[t - i + n] =back_diagonal[t + i] = true;
dfs(t + 1);
column[i] = diagonal[t - i + n] =back_diagonal[t + i] = false;//恢复现场
res[t][i] = '.';
}
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < n; j ++) res[i][j] = '.';//初始化
}
dfs(0);
return 0;
}
843. n-皇后问题
于 2024-01-28 15:33:55 首次发布
本文详细介绍了如何使用深度优先搜索(DFS)和回溯法在C++中解决经典的N皇后问题,涉及行、列、对角线冲突检测以及棋盘状态的更新和恢复。
摘要由CSDN通过智能技术生成