DFS解决N-皇后问题

题目:

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

DFS解决N-皇后问题_第1张图片

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

输入格式

共一行,包含整数 n。

输出格式

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

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

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

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

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

数据范围:1 <= n <= 9

 代码如下:

#include 
using namespace std;

const int N = 10;
int n;
char map[N][N];

void dfs(int u){
    if(u == n){
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                cout << map[i][j];
            }
            cout << endl;
        }
        cout << endl;
    }
    for(int i = 0; i < n; i++){
        bool isuse = true;
        for(int j = 0; j < n; j++){
            if(map[j][i] == 'Q' || (i + u - j < n && map[j][i + u - j] == 'Q') || (i - u + j >= 0 && map[j][i - u + j] == 'Q')){
                isuse = false;
                break;
            }
        }
        if(isuse){
            map[u][i] = 'Q';
            dfs(u+1);
            map[u][i] = '.';
        }
    }
}

int main(){
    cin >> n;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            map[i][j] = '.';
        }
    }
    dfs(0);
    return 0;
}

思路:套dfs模板,这里只解释下述代码,

if(map[j][i] == 'Q' || (i + u - j < n && map[j][i + u - j] == 'Q') || (i - u + j >= 0 && map[j][i - u + j] == 'Q')){

        isuse = false;

        break;

}

这里的map[j][i]是为了搜索列是否存在‘Q’,对于任意的坐标(u,i)与它的右上角和左上角来说,存在有以下关系:

左上角(j,k):u - j = i - k,得出 k =  i - u + j 。

右上角(j,k):u - j = k - i,得出 k = i + u - j 。

判断是否存在‘Q’,存在则令isuse为false;

你可能感兴趣的:(深度优先,算法,数据结构)