算法学习——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;
}

猜你喜欢

转载自www.cnblogs.com/Flydoggie/p/12299263.html