N 皇后问题

在 N*N 的棋盘上放置 N 个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上
不能放置 2 个皇后),编程求解所有的摆放方法。

输入

输入:n

输出
每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数占5个字符。若无方案,则输出
no solute!
样例输入
4
样例输出
    2    4    1    3
    3    1    4    2

dfs策略

#include<bits/stdc++.h>

using namespace std;

int n,place[14];
bool a[14],b[14],c[14];//分别对横纵方向和斜线方向判重

void DPS(int s)
{
    for(int k=1;k<=n;++k)
    {
        if(a[k]==0&&b[s+k]==0&&c[s-k+n-1]==0)
        {
            place[s]=k;//标记
            a[k]=1; 
            b[s+k]=1;
            c[s-k+n-1]=1;
            if(s==n)
            {
                for(int q=1;q<=n;++q)
                {
                    printf("%5d",place[q]);
                }
                cout<<endl;
            }
            else
            {
                DPS(s+1);
            }
            a[k]=0;//回溯
            b[s+k]=0;
            c[s-k+n-1]=0;
        }
    }
}
int main()
{
    cin>>n;
    
    DPS(1);
    
    return 0;
}

 

posted @ 2022-08-23 16:42  Cirpt  阅读(30)  评论(0)    收藏  举报