模板

void dfs()//参数用来表示状态
{
if(到达终点状态)
{
...//根据题意添加
return;
}
if(越界或者是不合法状态)
return;
if(特殊状态)//剪枝
return ;
for(扩展方式)
{
if(扩展方式所达到状态合法)
{
修改操作;//根据题意来添加
标记;
dfs();
(还原标记);
//是否还原标记根据题意
//如果加上(还原标记)就是 回溯法
}
}
}

46. 全排列

class Solution {
public:
vector<vector<int>> res;
vector<int> vis;
vector<vector<int>> permute(vector<int>& nums) {
vector<int> path;
vis.resize(nums.size(), 0);
dfs(nums, path, 0);
return res;
}
void dfs(vector<int> & nums, vector<int>& path, int len){//参数表示状态
if(len == nums.size()){//递归出口
res.push_back(path);return;
}
for(int i = 0;i < nums.size(); i++){//扩展方式
if(vis[i] == 0){//扩展方式合法
path.push_back(nums[i]);
vis[i] = 1;
dfs(nums,path,len + 1);
vis[i] = 0;
path.pop_back();
}
}
}
};

47. 全排列 II 排序去重

class Solution {
public:
vector<vector<int>> res;
vector<int> vis;
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
vis.resize(nums.size(),0);
vector<int> path;
dfs(nums,path, 0);
return res;
}
void dfs(vector<int>& nums, vector<int>& path, int depth){
if(depth == nums.size()){//递归出口
res.push_back(path);
return;
}
for(int i = 0; i < nums.size(); i++){
//在同一深度只会遍历第一个相同的数字,不同深度时vis[i-1] = 1
if(i && nums[i] == nums[i-1] && vis[i-1] == 0) continue;
if(vis[i] == 0){
vis[i] = 1;
path.push_back(nums[i]);
dfs(nums,path,depth + 1);
vis[i] = 0;
path.pop_back();
}
}
}
};

491. 递增子序列

class Solution {
public:
vector<vector<int>> res;
vector<int> vis;
vector<vector<int>> findSubsequences(vector<int>& nums) {
vis.resize(nums.size(),0);
vector<int> path;
dfs(nums,path,0);
return res;
}
void dfs(vector<int> & nums, vector<int>& path, int start){//参数表示状态,从前往后,depth改为start
if(path.size() >= 2){//过程状态也要记录
res.push_back(path);
}
if(start == nums.size()) return;
unordered_set<int> mp;//去重
for(int i = start;i < nums.size(); i++){//扩展方式
//if(vis[i] == 0){这里不需要vis
if((path.size() == 0 || nums[i] >= path.back()) && mp.count(nums[i]) == 0){
mp.insert(nums[i]);
path.push_back(nums[i]);
dfs(nums,path,i + 1);//这里别写错了
path.pop_back();
}
}
}
};

39. 组合总和

元素可以重复利用且没有顺序,所以不要vis数组

class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> combinationSum(vector<int>& nums, int target) {
vector<int> path;
dfs(nums,path,0,target);
return res;
}
void dfs(vector<int> &nums,vector<int>& path, int start, int target){
//出口
if(target < 0) return;
if(target == 0){
res.push_back(path);
return;
}
//遍历
for(int i = start; i <nums.size(); i++){
path.push_back(nums[i]);
dfs(nums,path,i, target - nums[i]);
path.pop_back();
}
}
};

40. 组合总和 II 比上题多了一个去重操作;

class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> combinationSum2(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());//加个去重操作
vector<int> path;
dfs(nums,path,0,target);
return res;
}
void dfs(vector<int> &nums,vector<int>& path, int start, int target){
//出口
if(target < 0) return;
if(target == 0){
res.push_back(path);
return;
}
//遍历
for(int i = start; i <nums.size(); i++){
if(i > start && nums[i] == nums[i-1] ) continue;//注意是i > start
path.push_back(nums[i]);
dfs(nums,path,i+1, target - nums[i]); // start = i + 1
path.pop_back();
}
}
};

78. 子集

class Solution {
public:
vector<vector<int>> res;
vector<int> vis;
vector<vector<int>> subsets(vector<int>& nums) {
vis.resize(nums.size(),0);
vector<int> path;
dfs(nums,path,0);
return res;
}
void dfs(vector<int> & nums, vector<int>& path, int start){//参数表示状态,从前往后,depth改为start
res.push_back(path);
if(start == nums.size()) return;
for(int i = start;i < nums.size(); i++){//扩展方式
//似乎没条件
path.push_back(nums[i]);
dfs(nums,path,i + 1);//这里别写错了
path.pop_back();
}
}
};

90. 子集 II 上题基础上加个去重

class Solution {
public:
vector<vector<int>> res;
vector<int> vis;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());//排序便于去重
vis.resize(nums.size(),0);
vector<int> path;
dfs(nums,path,0);
return res;
}
void dfs(vector<int> & nums, vector<int>& path, int start){//参数表示状态,从前往后,depth改为start
res.push_back(path);
if(start == nums.size()) return;
for(int i = start;i < nums.size(); i++){//扩展方式
if(i > start && nums[i] == nums[i-1]) continue; //去重
path.push_back(nums[i]);
dfs(nums,path,i + 1);//这里别写错了
path.pop_back();
}
}
};

进阶:N皇后问题

51. N皇后

class Solution {
public:
vector<vector<string>> res;
vector<vector<string>> solveNQueens(int n) {
string t = "";
for(int i = 0; i < n; i++) t += '.';
vector<string> path(n,t);
vector<vector<int>> vis(n, vector<int>(n,0));
dfs(path,vis,n,0);
return res;
}
void dfs(vector<string>& path,vector<vector<int>> &vis, int& n, int row){
if(row == n){//递归出口,前n行全部被赋值
res.push_back(path);return;
}
for(int j = 0; j < n; j++){//遍历一行
if(vis[row][j] == 0){//条件
path[row][j] = 'Q';
//注意,不能直接让vis变1和变0,否则后来的修改可能会改变原来的修改
for(int i = row; i < n; i++)vis[i][j]++;//该列
for(int i = row; i < n; i++){//对角线
if(j + i - row < n) vis[i][j + i - row]++;
if(j + row - i >= 0) vis[i][j + row - i]++;
}
dfs(path, vis, n, row + 1);
path[row][j] = '.';
for(int i = row; i < n; i++)vis[i][j]--;//该列
for(int i = row; i < n; i++){//对角线
if(j + i - row < n) vis[i][j + i - row]--;
if(j + row - i >= 0) vis[i][j + row - i]--;
}
}
}
}
};

37. 解数独

class Solution {
public:
int col[9][9] = {0};
int row[9][9] = {0};
int box[9][9] = {0};
void solveSudoku(vector<vector<char>>& board) {
int n = board.size();
//初始化
for(int i = 0; i <9; i++)
for(int j = 0; j < 9; j++){
if(board[i][j] != '.'){
int t = board[i][j] - '1';
col[j][t]++;
row[i][t]++;
box[i/3*3+ j/3][t]++;
}
}
dfs(board, 0, 0);
}
//传参 int a[][9] 或者 int (*a)[9] 而不是 (int*)[9] a
// box x/3*3 + y/3 而不是 x/3 + y/3;
// (y + 1)%3 而不是 (++y)/3
bool dfs(vector<vector<char>>& board, int x, int y){
if(x == 9) return true;//递归出口
//特殊状态
if(board[x][y] != '.') return dfs(board,x + (y==8),(++y)%9);
for(int k = 0; k < 9; k++){//遍历
//条件
if(row[x][k] || col[y][k] || box[x/3*3 + y/3][k]) continue;
board[x][y] = k + '1';
row[x][k]++;col[y][k]++;box[x/3*3 + y/3][k]++;
if(dfs(board,x + (y==8),(y + 1)%9)) return true;//找到一个解就退出
board[x][y] = '.';
row[x][k]--;col[y][k]--;box[x/3*3 + y/3][k]--;
}
return false;
}
};

dfs-入门模板的更多相关文章

  1. 算法学习之BFS、DFS入门

    算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...

  2. HDU 1251 统计难题(字典树入门模板题 很重要)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  3. 母函数(Generation Function) 入门 + 模板

    转自:母函数 入门 + 模板  感谢 在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息.使用母函数解决问题的 ...

  4. DFS 算法模板

    dfs算法模板: 1.下一层是多节点的dfs遍历 def dfs(array or root, cur_layer, path, result): if cur_layer == len(array) ...

  5. DFS算法(——模板习题与总结)

    首先,需要说明的是搜索算法本质上也是枚举的一种,时间复杂度还是很高的,遇到问题(特别是有水平的比赛上),不要优先使用搜索算法. 这里总结一下DFS算法: 1.从图中某个顶点出发,访问v. 2.找出刚访 ...

  6. Oil Deposits(poj 1526 DFS入门题)

    http://poj.org/problem?id=1562                                                                       ...

  7. 网络流之最大流与最小费用流入门&&模板

    理解处 刷题处 模板处 最大流模板 处理重边的+(优化) #include<bits/stdc++.h> using namespace std; ; const int INF = 0x ...

  8. hdu 3549 Flow Problem【最大流增广路入门模板题】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...

  9. 图的dfs遍历模板(邻接表和邻接矩阵存储)

    我们做算法题的目的是解决问题,完成任务,而不是创造算法,解题的过程是利用算法的过程而不是创造算法的过程,我们不能不能陷入这样的认识误区.而想要快速高效的利用算法解决算法题,积累算法模板就很重要,利用模 ...

  10. hdu:2089 ( 数位dp入门+模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...

随机推荐

  1. 我们来汉化IntelliJ IDEA

    (原发于 GitHub Pages,2018-10-13 13:51:09) 两年前我从一名光荣的C++程序员专业为PHP程序员以后,告别了世界第一IDE Visual Studio,改用当时觉得特别 ...

  2. Maui Blazor 使用摄像头实现

    Maui Blazor 使用摄像头实现 由于Maui Blazor中界面是由WebView渲染,所以再使用Android的摄像头时无法去获取,因为原生的摄像头需要绑定界面组件 所以我找到了其他的实现方 ...

  3. flutter Error:Cannot run with sound null safety, because the following dependencies don't support

    学习flutter新版本的路上,真的是一天一个新惊喜啊 今天遇到的坑是 Flutter 升级高版本后,运行和build 报错 Error: Cannot run with sound null saf ...

  4. 基础分类算法_KNN算法

    KNN(K-NearestNeighbor)算法 KNN算法是有监督学习中的分类算法. KNN算法很特殊,可以被认为是没有模型的算法,也可以认为其训练数据集就是模型本身. KNN算法的原理 KNN的原 ...

  5. CTFshow刷题记录

    整理的一些ctf题目 WEB题 ctfshow 年CTF 除夕 题目要求通过get传入year参数然后进行判断是否成立,成立就返回flag 这里可以用科学计数法表示通过get传入year=2.022e ...

  6. WPF中使用WebView2控件

    目录 WebView2简介 概述 优势 支持的运行时平台 进程模型 基本使用 安装WebView2运行时 安装WebView2Sdk 打开一个网页 导航事件 打开一个网页的过程 更改url的过程 空u ...

  7. Quartz.Net源码Example之Quartz.Examples.AspNetCore

    Quartz.Examples.AspNetCore ​ .NetCore的Web系统,后台主要执行多个触发器任务,前台展示所有触发器信息和正在执行的作业的相关信息,还可以通过访问health-UI来 ...

  8. pdf转图片加水印压缩

    ''' pip install pymupdf pip install pillow ''' import os import uuid import fitz from PIL import Ima ...

  9. JSON Crack 数据可视化工具

    JSON Crack简介 JSON Crack 是一个很方便的 JSON 数据可视化工具. 该项目不是简单的展示 JSON 数据,而是将其转化为类似思维导图的形式,支持放大/缩小.展开/收缩.搜索节点 ...

  10. Powershell获取当前文件夹内所有一级子文件夹大小

    需求:查看Windows某个文件夹所有一级子文件夹大小,并按照从大到小排序 解决方案:使用Powershell脚本 脚本内容如下 function filesize () {   [string]$f ...