算法学习——DFS(暴力搜索)N皇后问题

Posted flydoggie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习——DFS(暴力搜索)N皇后问题相关的知识,希望对你有一定的参考价值。

N皇后问题是非常经典的一道问题,解题的方法也有很多,非常经典包括暴力回溯法。

DFS就是深度优先搜索的首字母,简单理解就是把所有可能是答案的结果都尝试一遍,用走迷宫来举例子的话就是一条路走到黑,如果走到死路了,再退回上一个分岔口选择另一条路继续一条路走到黑。

属于入门时非常常用的暴力算法,考察的知识点主要是对递归的掌握和理解。递归也是新生入门算法时必经的一道门槛,理解透彻递归,就能明白DFS。

技术图片

 

 

#include<bits/stdc++.h>
using namespace std;

const int N = 110;

char maze[N][N];
//col[]判断该列是否已经有棋子;k[]判断左斜线是否有棋子;p[]判断右斜线是否有棋子
int col[N],k[N],p[N];
int n ;
void dfs(int t){
    if( t == n+1 ){
        for(int i = 1 ; i <= n ; i ++){
            for(int j = 1 ; j <= n ; j ++){
                cout<<maze[i][j];
            }
            cout<<endl;
        }
        cout<<endl;
        return;
    }
    
    for(int i = 1; i <= n;i++)
        // 根据斜率公式:y = kx + b 
        //k[]的斜率为1,所以我们判断在同一直线上的点,只需要把k = 1和x,y坐标代入,判断b = y - x是否相等
        //同时为了防止数组下标为负数,所以我们增加一个偏移量n,得到了k[n + i - t]
        //同理,p[]的斜率为-1,所以我们得到b = y + x ------> p[i + t]
        if(maze[t][i] != Q && col[i] != 1 && k[n+i-t] != 1 && p[t+i] != 1 ){
            maze[t][i] = Q;
            col[i] = 1;
            p[t+i] = 1;
            k[n-t+i] = 1;
            dfs(t+1);
            col[i] = 0;
            p[t+i] = 0;
            k[n-t+i] = 0;
            maze[t][i] = .;
        }
}

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

 

以上是关于算法学习——DFS(暴力搜索)N皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

图-搜索-DFS-51. N皇后

暴力穷举和回溯法(八皇后问题)

算法入门经典-第七章 例题7-4-1 拓展 n皇后问题 回溯法

棋盘问题 dfs分层搜索(n皇后变式)

算法整理-回溯和DFS

HDU 2553 N皇后问题(DFS)