C++深度优先搜素

深度优先搜索特点:穷举所有情况、全排列==完全图、顶点数最好小于11、需要哈希表和栈的数据结构基础。

算法描述,第一步,初始化数据结构,全排列在计算过程中,需要利用一个哈希表visited和一个栈stack来记录当前访问过的节点。其中哈希表是为了快速查找某个节点是否被访问,并且执行插入,栈是为了记录顶点的访问顺序。

第二步,顶点访问,依次访问所有顶点,如果发现这个顶点没有在哈希表中,则把它插入哈希表,并且把这个顶点入栈。这样一来,哈希表和栈中,存储的就是本次遍历中存储的点。

第三步,递归调用,利用递归进行调用自身,继续访问下一个节点。

第四步,当本次访问的顶点数等于总顶点数的时候,栈中的元素就代表一个排列,把排列进行输出或者做其他相应的处理。

第五步,回溯,当没有任何顶点需要访问的时候,进行回溯。回溯就是将栈顶元素出栈,并且将这个元素从哈希表中移除

代码分析,

第一步,初始化数据结构

function initData(visited, stack)

visited.clear()

stack.clear()

第二步,框架代码

function dfs(depth, maxDepth)

if depth == maxDepth

print(stack)

return

for i -> (0, maxDepth - 1)

if i not in visited

visited.add(i)

stack.push(i)

dfs(depth+1, maxDepth)

visited.remove(i)

stack.pop()

这个算法时间复杂度为n的阶乘

代码练习 1 对应蓝桥云课 排列序数 代码见下

cpp 复制代码
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;

#define maxn 10
string str;

int ans;
int visited[maxn];
int stack[maxn];
int cnt;
string sorted;
void dfs(int depth, int maxDepth){
  if(depth == maxDepth){
    int i;
    for(i=0; i<maxDepth; ++i){
      int idx = stack[i];
      if(sorted[idx] != str[i]){
        break;
      }
    }
    if(i == maxDepth){
      ans = cnt;
    }
    ++cnt;
    return;
  }
  for(int i=0; i<maxDepth; ++i){
    if(!visited[i]){
      visited[i] = 1;
      stack[depth] = i;
      dfs(depth+1, maxDepth);
      visited[i] = 0;
    }
  }
}
int main()
{
  cin >> str;
  sorted = str;
  sort(sorted.begin(), sorted.end());
  memset(visited, 0, sizeof(visited));
  cnt = 0;
  dfs(0, str.size());
  cout << ans << endl;
  // 请在此输入您的代码
  return 0;
}

代码练习 2 对应蓝桥云课 十位数宝藏代码 代码见下

cpp 复制代码
#include <iostream>
using namespace std;

#define maxn 10

int visited[maxn];
int stack[maxn];

long long Min = (long long)9876543210;
long long Max = 0;

void dfs(int depth, int maxDepth, long long ans){
  if(depth == maxDepth){
    if(ans % 11 == 0){
      if(ans < Min) Min = ans;
      if(ans > Max) Max = ans;
    }
    return;
  }
  if(depth == 1){
    if(ans == 0){
      return;
    }
  }
  for(int i=0; i<maxDepth; ++i){
    if(!visited[i]){
      visited[i] = 1;
      stack[depth] = i;
      dfs(depth+1, maxDepth, ans*10 + i);
      visited[i] = 0;
    }
  }
}

int main()
{
  dfs(0, 10, 0);
  cout << Max - Min << endl;

  // 请在此输入您的代码
  return 0;
}

代码练习3 对应蓝桥云课带分数, 代码见下

cpp 复制代码
#include <iostream>
using namespace std;

// #define maxn 10

// int visited[maxn];
// int stack[maxn];

// void dfs(int depth, int maxDepth){
//   if(depth == maxDepth){
//      // stack存储了[0, maxDepth-1]的全排列
//     return;
//   }
//   for(int i=0; i<maxDepth; ++i){
//     if(!visited[i]){
//       visited[i] = 1;
//       stack[depth] = i;
//       dfs(depth+1, maxDepth);
//       visited[i] = 0;
//     }
//   }
// }

#define maxn 10
int N;
int ans;
int visited[maxn];

int pow10[maxn] = {
  1,
  10,
  100,
  1000,
  10000,
  100000,
  1000000,
  10000000,
  100000000,
  1000000000
};
int cnt(int sum){
  int ans = 0;
  for(int i = 8; i >= 0; --i){
    int x = sum / pow10[i];
    if(N <= x){
      break;
    }
    int y = N - x;
    int z = sum % pow10[i];
    for(int j = 1 ; ; ++j){
      int fm = z % pow10[j];
      int fz = z / pow10[j];
      if(fz < fm){
        break;
      }
      if(fz % fm == 0){
        if(fz / fm == y){
          ++ans;
        }
      }
    }
  }
  return ans;
}

void dfs(int depth, int maxDepth, int sum){
  if(depth == maxDepth){
    ans += cnt(sum);
     // stack存储了[0, maxDepth-1]的全排列
    return;
  }
  for(int i=0; i<maxDepth; ++i){
    if(!visited[i]){
      visited[i] = 1;
      dfs(depth+1, maxDepth, sum*10+(i+1));
      visited[i] = 0;
    }
  }
}

int main()
{
  cin >> N;
  dfs(0, 9, 0);
  cout << ans << endl;

  // 请在此输入您的代码
  return 0;
}
相关推荐
毕设源码尹学长14 分钟前
计算机毕业设计 java 血液中心服务系统 基于 Java 的血液管理平台Java 开发的血液服务系统
java·开发语言·课程设计
A7bert77734 分钟前
【YOLOv5部署至RK3588】模型训练→转换RKNN→开发板部署
c++·人工智能·python·深度学习·yolo·目标检测·机器学习
lumi.37 分钟前
2.3零基础玩转uni-app轮播图:从入门到精通 (咸虾米总结)
java·开发语言·前端·vue.js·微信小程序·uni-app·vue
oioihoii1 小时前
现代C++工具链实战:CMake + Conan + vcpkg依赖管理
开发语言·c++
m0_480502641 小时前
Rust 入门 注释和文档之 cargo doc (二十三)
开发语言·后端·rust
黑客影儿1 小时前
使用UE5开发2.5D开放世界战略养成类游戏的硬件配置指南
开发语言·c++·人工智能·游戏·智能手机·ue5·游戏引擎
Aiah.2 小时前
数字图像处理(一)
开发语言·计算机视觉·matlab·数字图像处理
九离十2 小时前
STL——vector的使用(快速入门详细)
开发语言·c++·stl
君鼎2 小时前
More Effective C++ 条款08:理解各种不同意义的new和delete
c++
十五年专注C++开发2 小时前
通信中间件 Fast DDS(二) :详细介绍
linux·c++·windows·中间件·fastdds