题目描述:

n皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

输入格式

共一行,包含整数 n。

输出格式

每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。

其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。

每个方案输出完成后,输出一个空行。

注意:行末不能有多余空格。

输出方案的顺序任意,只要不重复且没有遗漏即可。

数据范围

1≤n≤9

输入样例:

4

输出样例:

.Q..
...QQ...
..Q.

..Q.Q...
...Q.Q..



注意事项:注意定义数组的长度:不能太小,否则后面的数据不通过


解题思路:

        从第一行第一个格子开始枚举,如果当前格子没有被标记过,则使该格子当前的行,列,以及对角线,,反对角线上的格子全部赋值为真,因为一行只能有一个皇后,每当每一行填进去了一个皇后,则从下一行开始枚举,以此类推,直到全部枚举完,输出可行的方案。

        用ans[]数组存储答案,每找到一个皇后,把当前的列数赋值给ans[];


        关于对角线的表示:可以用截距表示,截距相等则为同一条对角线。反对角线,y=-x+b, b=x+y,b这里代表截距,正对角线y=x+b,b=y-x,所以这里的b可能是负的,但作为数组下标,不能是负的,所以我们把正对角线加上一个偏移量,b=y-x+n是没影响的。



参考代码:

```

#include<iostream>

using namespace std;
const int N= 20;

int n;
char g[N][N];//存储路径
bool col[N],dg[N],udg[N];//col[]是列,dg[]对角线,udg[]反对角线

void dfs(int u)
{
    if(n==u)//如果找到一种解
    {
        for(int i=0;i<n;i++)
            cout<<g[i]<<endl;//输出某一行
            cout<<endl;
            return; 
    }
    for(int i=0;i<n;i++)
    {
        if(!col[i] && !dg[u+i] && !udg[n-u+i])//如果'该列''该对角线''该反对角线'上的均为零,则没有值,进行循环
        {
            g[u][i]='Q';//把当前符合的点赋值Q
            col[i]=dg[u+i]=udg[n-u+i]=true;//并且赋为真
            dfs(u+1);//递归到下一层
            col[i]=dg[u+i]=udg[n-u+i]=false;//恢复现场,把值全部赋值回去,成'.';
            g[u][i]='.';
        }
    }
}


int main()
{
    cin>>n;
    for(int i=0;i<n;i++)//全部初始化棋盘为'.';
    {
        for(int j=0;j<n;j++)
        {
            g[i][j]='.';
        }
    }    
    dfs(0);//从第零层开始递归

    return 0;
}


```


点赞(0)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论