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

基础算法学习--dfs和bfs

时间:2021-04-07 11:21:16      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ret   tip   over   names   strong   方法   注意   输出   char   

dfs的模板

注意bool判断是否走过这个点并注意回溯的处理。
注意条件判断和边界问题。

//边界判断即剪枝
if(chk()) return;
if(over(BianJie)) return;

if(bool = false)//未搜索过
  bool = true;
  //赋值或纪录
  dfs(n + 1);
  //复原赋值即回溯
  bool = false;

dfs 小例题

题目
给定一个整数 n,将数字 1~n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。

ac代码

#include<iostream>

using namespace std;

const int N  = 1e6;

bool chk[N];
int res[N];
int n;

void dfs (int num){
    if(num == n){
        for(int i = 0; i < num;i ++ ) cout<<res[i]<<‘ ‘;
        cout<<endl;
        return;
    }
    
    for(int i = 1;i <= n;i ++){
        if(!chk[i]){
            chk[i] = true;
            
            res[num] = i;
            
            dfs(num + 1);
            
            chk[i] = false;
        }
    }
}

int main(){
    cin >> n;
    
    dfs(0);
    
    return 0;
}

n皇后问题题解

#include<iostream>

using namespace std;

const int N = 20;

int n;
char res[N][N];
bool col[N],dg[N],udg[N];

void dfs(int u){
    if( u == n ){
        for(int i = 0;i <n ;i ++ )puts(res[i]);
        cout<<endl;
        return;
    }
    
    for(int i = 0;i < n;i ++){
        if(!col[i] && !dg[u + i] && !udg[n - u + i]){
            col[i] = dg[u + i] = udg[n - u + i] = 1;
            res[u][i] = ‘Q‘;
            dfs(u + 1);
            col[i] = dg[u + i] = udg[n - u + i] = 0;
            res[u][i] = ‘.‘;
        }
    }
}

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

小tips

  • 当处在第i列第u行时,正对角线下标为u + i,反对角线为n - u + i;

基础算法学习--dfs和bfs

标签:ret   tip   over   names   strong   方法   注意   输出   char   

原文地址:https://www.cnblogs.com/Xuuxxi/p/14619465.html

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