今天终于弄懂了八皇后问题
#include <iostream>
using namespace std;
const int N = 11;
char q[N][N];//存储棋盘
bool dg[N * 2], udg[N * 2], cor[N];//点对应的两个斜线以及列上是否有皇后
int n;
void dfs(int r)
{
if(r == n)//放满了棋盘,输出棋盘
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
cout << q[i][j];
cout << endl;
}
cout << endl;
return;
}
for(int i = 0; i < n; i++)//第 r 行,第 i 列 是否放皇后
{
if(!cor[i] && !dg[i + r] && !udg[n - i + r])//不冲突,放皇后
{
q[r][i] = 'Q';
cor[i] = dg[i + r] = udg[n - i + r] = 1;//对应的 列, 斜线 状态改变
dfs(r + 1);//处理下一行
cor[i] = dg[i + r] = udg[n - i + r] = 0;//恢复现场
q[r][i] = '.';
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < n; j ++ )
q[i][j] = '.';
dfs(0);
return 0;
}
作者:Hasity
链接:https://www.acwing.com/solution/content/30231/
来源:AcWing
(这是一个大佬做出来的,让我直接弄懂了。其实dfs这个函数其实就是一个递归,如果周围没有皇后就可以继续,其实就是一段程序)
if(!col[,,,],!dg[...],!udg[...])
{
q[r][l]='Q;
然后统一处理这个数周围几个数(或者说就是一种更新)
}