49、【图】N-皇后问题(C/C++版)

题目描述

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

49、【图】N-皇后问题(C/C++版)_第1张图片

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

输入格式

共一行,包含整数 n。

输出格式

每个解决方案占 n行,每行输出一个长度为 n的字符串,用来表示完整的棋盘状态。其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。
注意:行末不能有多余空格。输出方案的顺序任意,只要不重复且没有遗漏即可。

数据范围

1≤n≤9

输入样例:

4

输出样例:

.Q…
…Q
Q…
…Q.

…Q.
Q…
…Q
.Q…

方法一:已定结构顺序放置

(1)分析

边界条件:行、列、主对角线、副对角线均只能有一个皇后

由于该题为各种排列的组合情况且可按照某种顺序进行排列,因此可选用DFS算法。

具体思路:从(0,0)出发,按行放置皇后,若选取的下一行中的位置其对应的列、主对角线和副对角线没有其余皇后与之冲突,才进行放置,放置完后,将对应的列、主对角线和副对角线标记为已有皇后。若不满足其上述的任意条件,则再查找下一个位置进行查找。

对主对角线进行分析,
49、【图】N-皇后问题(C/C++版)_第2张图片
主对角线元素为:A[0][0]、A[1][1]、…、A[2][1]、A[3][2]…

设主对角线上元素的行下标为i,列下标为j,可发现主对角所在下标满足这样一种性质:
i - j = b

其中b为常数。

对副对角线进行分析,
49、【图】N-皇后问题(C/C++版)_第3张图片
主对角线元素为:A[1][n]、A[2][n-1]、…、A[1][n-1]、A[2][n-2]…

设主对角线上元素的行下标为i,列下标为j,可发现主对角所在下标满足这样一种性质:
i + j = b

其中b为常数。

抽象推广
49、【图】N-皇后问题(C/C++版)_第4张图片
棋盘中的下标,相当于坐标系下离散化的点。同一斜线上的元素,相当于符合一元线性关系的函数上的值,因此通过确定行和列之间的关系,来得到一个很恒定的常量b。通过设立一个数组A,用其下标来表示不同斜线下对应的常量b,当同一斜线上已有元素时,就让A[b] = 1,进行标记。

在y = x + b这条线上,b = -x + y,为了防止出现负数,将其进行规格化为n - x + y,保证对角线上元素的相对值相同即可。

(2)算法实现

#include <stdio.h>

const int N = 10;
int n;
char g[N][N];       // 存储图中元素
// col[i]: 存储对应列是否已有元素
// dig[i]: 存储主对角线上是否已有元素
// udig[i]:存储副对角线上是否已有元素
bool col[N], dig[N], udig[N];       

void dfs(int u){
     
    if(n == u){
     
        for(int i = 0; i < n; i++)          puts(g[i]);     // 按行输出图
        puts("");
        return ;
    }

    for(int i = 0; i < n; i++){
     
        if(!col[i] && !dig[u + i] && !udig[n - u + i]){
          // 若列、主和副对角线上没有元素,则使用该位置
            g[u][i] = 'Q';
            col[i] = dig[u + i] = udig[n - u + i] = true;   // 标记该位置已有元素
            dfs(u + 1);
            col[i] = dig[u + i] = udig[n - u + i] = false;
            g[u][i] = '.';
        }
    }

}


int main(){
     
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            g[i][j] = '.';

    dfs(0);

    return 0;
}

参考文章:
N皇后

nQueen-采取合适的方法表示主对角线和副对角线

你可能感兴趣的:(算法刷题,算法,数据结构,dfs)