码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-02-12 16:26:00      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:判断   nbsp   ret   深度优先搜索   首字母   知识点   char   name   举例   

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皇后问题

标签:判断   nbsp   ret   深度优先搜索   首字母   知识点   char   name   举例   

原文地址:https://www.cnblogs.com/Flydoggie/p/12299263.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!