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

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

时间: 2024-10-07 20:51:43

算法学习——DFS(暴力搜索)N皇后问题的相关文章

hdu 1427 速算24点 dfs暴力搜索

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次).游戏很简单,但遇到无解的

ACM: Gym 100935G Board Game - DFS暴力搜索

Board Game Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Gym 100935G Description standard input/outputStatements Feras bought to his nephew Saleem a new game to help him learning calculating. The game consists of a boar

hdu1015 dfs暴力搜索所有情况模板

脑子有点坑,不知道为什么,可能以前遇到阴影了,现在看到dfs暴力搜有种莫名的害怕,总结一下模板吧 这题还是没意思的,直接暴力搜,不过我写的很烂,可能就是这个原因吧,看了别人的模板,觉得不错. 学了个单词”lexicography“ 字典序,又吃了没文化的亏,wa一次 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath>

UVALive 5844 dfs暴力搜索

题目链接:UVAive 5844 Leet DES:大意是给出两个字符串.第一个字符串里的字符可以由1-k个字符代替.问这两个字符串是不是相等.因为1<=k<=3.而且第一个字符串长度小于等于15.所以.对第一个字符串里的每一个字符尝试匹配1-k个字符看是否有可能相等就好了. 比赛的时候想到这是dfs类暴力,但是map<char, char*>没用过.不知道怎么记录了.而且dfs本身就不太会用.依然感觉dfs很奇妙. #include <iostream> #inclu

算法导论——DFS深度优先搜索

package org.loda.graph; import org.loda.structure.Stack; /** * * @ClassName: DFS * @Description: 深度优先搜索(无向图) * @author minjun * @date 2015年5月24日 上午4:02:24 * */ public class DFS { //原点 private int s; // visited[i]表示i节点是否被访问过 private boolean[] visited;

洛谷P1019——单词接龙(DFS暴力搜索)

https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输

UVALive 5107 dfs暴力搜索

题目链接:A hard Aoshu Problem DES:给三个字符串,包含的字符是A-E范围内的.长度都不超过8.每个字符可以而且只可以匹配一个数字.两个字符不能匹配相同的数字.前两个式子之间可以有+-*/四中关系.然后=第三个式子.问.会有多少种关系式. #include<stdio.h> #include<string.h> #include<iostream> using namespace std; char s[3][10]; int a[10], b[1

&lt;DFS搜索&gt; N皇后问题

N皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.,由此演变出N皇后问题: 下面给出N皇后的两种求解方式: 第一种方式:DFS直接搜索 代码: <span style="font

11214 - Guarding the Chessboard(暴力搜索)

IDA*算法, 从小到大枚举深度上限,不过该题是有深度上限的,题目中的第一个样例表明:最多需要5个皇后就可以覆盖整个棋盘 . 利用紫书上的技巧,我们可以快速的判断任意两个棋子是不是在同一行.同一列.同一对角线 (详情见紫书P193那两个图). 这样之后暴力搜索就可以了 . 每一层需要O(nm)的复杂度,但是实际上并不需要那么大的复杂度 .和八皇后问题类似 , 当前行之前的行已经放置了皇后,所以不必在管,每次从下一行开始放置就好 . 细节见代码: #include<bits/stdc++.h>