843. n-皇后问题

https://www.acwing.com/problem/content/845/

经典暴搜题,有多种写法,这里用dfs按行搜索
用col,dg,udg确定此位置是否可以放棋子,对于dg,udg,有斜率为1,-1的直线方程,根据截距的不同可以确定不同的直线
按行搜索,可以不用row,因为每行只会放一个棋子,放完棋子后直接继续搜索下一行了

#include<iostream>
using namespace std;
const int N = 10;
char map[N][N];
int n;
bool col[N],dg[N],udg[N];//列,正斜率对角,负斜率对角
void dfs(int x)
{
    if(x==n)//枚举到最后一行
    {
        for(int i=0;i<n;i++)
            cout << map[i] << endl;
        puts("");
        return;
    }
    for(int i=0;i<n;i++)//枚举第x行,查看哪一列可以放棋子,这样枚举一行只有一个棋子能放
    {
        if(!col[i] && !dg[i-x+n] && !udg[x+i])//此列,此对角线,此负对角线都没有棋子
        {
            map[x][i]='Q';
            col[i]=dg[i-x+n]=udg[x+i]=true;
            dfs(x+1);
            col[i]=dg[i-x+n]=udg[x+i]=false;//恢复现场
            map[x][i]='.';
        }
    }
}
int main()
{
    cin >> n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            map[i][j]='.';
    dfs(0);
}

 

posted @ 2023-02-28 23:41  风乐  阅读(128)  评论(0)    收藏  举报