内部搜索不用(能)回溯,外部搜索才需要(必须)回溯和恢复现场

A、AcWing 1112. 迷宫

内部搜索的一道dfs模板题,别忘了vis

#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int N = 110;int a[N];
int n, m;
int k;
char g[N][N];
int sx, sy, ex, ey;
bool vis[N][N];
const int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};bool dfs(int x,int y){if(g[x][y] == '#')return false;if(x == ex && y == ey)return true;vis[x][y] = true;for(int i = 0;i < 4; ++ i){int a = x + dx[i];int b = y + dy[i];if(a < 0 || b < 0 || a >= n || b  >= n)continue;if(vis[a][b]) continue;if(dfs(a, b))return true;}return false;
}int main(){scanf("%d",&k);while(k -- ){scanf("%d", &n);for(int i = 0;i < n;++i){scanf("%s", &g[i]);}scanf("%d%d%d%d", &sx, &sy, &ex, &ey);memset(vis,0, sizeof vis);if(dfs(sx, sy))puts("YES");else puts("NO");}return 0;
}

B、AcWing 1113. 红与黑

同样是一道内部搜索的题。
同样别忘了vis判断数组,

#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int N = 507, M = N * N;
char g[N][N];
int n, m;
int sx, sy;
bool vis[N][N];
int ans;const int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};void dfs(int x, int y){vis[x][y] = true;for(int i = 0;i < 4;++ i){int a = x + dx[i];int b = y + dy[i];if(a < 0 || b < 0 || a >= n || b >= m)continue;if(vis[a][b])continue;if(g[a][b] == '#')continue;ans ++ ;dfs(a, b);}
}int main(){while(scanf("%d%d", &m, &n) != EOF && n && m){ans = 0;memset(vis,0,sizeof vis);for(int i = 0;i < n; ++ i)scanf("%s", &g[i]);for(int i = 0;i < n; ++ i)for(int j = 0;j < m; ++ j)if(g[i][j] == '@')ans = 1, dfs(i, j);printf("%d\n", ans);}return 0;
}

C、AcWing 1116. 马走日

外部搜索。
因为题目要的是走完全部格子的方案数,所以我们判断依据就是cnt == n * m即可。
然后回溯和恢复现场,特别基础的例题

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;const int N = 110, M = N * N ;int n, m,t;
int a[N];
int ans;
bool vis[N][N];const int dx[] = {1, 2, 2, 1, -1, -2, -2, -1};
const int dy[] = {-2, -1, 1, 2, 2, 1, -1, -2};void dfs(int x, int y, int cnt){if(cnt == n * m){ans ++ ;return ;}vis[x][y] = true;for(int i = 0;i < 8; ++ i){int a = x + dx[i];int b = y + dy[i];if(a < 0 || b < 0 || a >= n || b >= m)continue;if(vis[a][b])continue;dfs(a, b, cnt + 1);}vis[x][y] = false;
}int main(){int x, y;scanf("%d", &t);while(t -- ){memset(vis,0,sizeof vis);ans = 0;scanf("%d%d%d%d", &n, &m, &x, &y);dfs(x, y, 1);printf("%d\n", ans);}return 0;
}

D、AcWing 1117. 单词接龙

本题中每一个单词都可以重复使用两次
然后预处理一下所有的单词是否有重复的字母,直接爆搜即可, 写的比较简单。

这里是外部搜索,也就是每个状态之间进行搜索转移,所以需要回溯和恢复现场。

#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>using namespace std;
const int N = 110, M = N * N;int n, m;
string word[N];
int ans;
int used[N];
int f[N][N];void dfs(string dargan, int last){ans = max(ans, int(dargan.size()));used[last] ++ ;for(int i = 1;i <= n;++ i)if(f[last][i] && used[i] < 2){dfs(dargan + word[i].substr(f[last][i]), i);}used[last] --;//恢复现场
}int main(){scanf("%d", &n);for(int i = 1;i <= n; ++ i)cin >> word[i];for(int i = 1;i <= n;++i)for(int j = 1;j <= n;++j){string a = word[i], b = word[j];for(int k = 1;k <= min(int(a.size()), int(b.size())); ++ k){if(a.substr(a.length() - k, k) == b.substr(0, k)){f[i][j] = k;break;}}}char ch;cin >> ch;for(int i = 1;i <= n;++i)if(word[i][0] == ch)dfs(word[i], i);printf("%d\n", ans);return 0;
}

E、AcWing 1118. 分成互质组


如果不加now优化循环就会T…

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;const int N = 110, INF = 0x3f3f3f3f;
int n, m;
int a[N];
int group[N][N];
int ans = INF;
bool vis[N];bool check(int g[], int gc, int x){for(int i = 0;i < gc; ++ i){if(__gcd(a[g[i]], a[x]) > 1)return false;}return true;
}void dfs(int gnum, int gc, int putnum, int now){bool flag = true;if(gnum >= ans)return ;if(putnum == n)ans = gnum;for(int i = now; i < n;++ i){//可以放下if(!vis[i] && check(group[gnum], gc, i)){vis[i] = true;group[gnum][gc] = i;dfs(gnum, gc + 1, putnum + 1, i + 1);vis[i] = false;flag = false;}    }//放不了开新组Zif(flag)dfs(gnum + 1, 0, putnum, 0);
}int main(){scanf("%d", &n);for(int i = 0; i < n;++ i){scanf("%d", &a[i]);}dfs(1, 0, 0, 0);printf("%d\n", ans);return 0;
}

【搜索专题】DFS之连通性模型与搜索顺序相关推荐

  1. 算法提高课-搜索-DFS之连通性模型-AcWing 1113. 红与黑:dfs和bfs两种做法

    题目分析 来源:acwing 分析: ac代码 dfs写法 dfs搜的时候需要dfs(下一状态) 本题统计连续的黑色格子数量 :从(x, y) – > (a ,b) 扩展时, cnt += df ...

  2. 算法提高课-搜索-DFS之连通性模型-AcWing 1112. 迷宫:dfs和bfs两种解法

    题目分析 来源:acwing 分析: dfs是一路搜下去,不撞南墙不回头. dfs解法 #include<bits/stdc++.h> using namespace std; const ...

  3. 高级数据结构与算法 | 深度遍历搜索(DFS)与广度遍历搜索(BFS)

    文章目录 深度优先搜索(DFS) 员工的重要性 图像渲染 岛屿的周长 被围绕的区域 岛屿数量 岛屿的最大面积 广度优先搜索(BFS) N叉树的层序遍历 腐烂的橘子 单词接龙 最小基因变化 打开转盘锁 ...

  4. 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)

    前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...

  5. 深度优先搜索(DFS)与广度优先搜索(BFS)详解

    原文来自<挑战程序设计竞赛> 深度优先搜索(DFS)和宽度优先搜索(BFS)都是常见的搜索算法.在学习DFS和BFS之前,我们首先得知道递归函数的概念. 1. 递归函数 通俗地讲,一个函数 ...

  6. 专题·深度优先搜索(DFS)【including 2N皇后,等边三角形,中国邮递员问题

    初见安~这篇我们来讲讲深搜(DFS) 前文我们讲过了递归[这里是递推递归],这里我们就要运用到啦~ 所谓深搜,也顾名思义就是在深度上搜索,到了尽头则返回上一层,换一条路继续搜--也就是递归思想. 先看 ...

  7. 【蓝桥杯】搜索专题总结——真题讲解

    写在前面 小伙伴们我们又见面啦~这篇文章拖了又拖,终于写完啦.这篇讲了几道蓝桥杯中考察DFS和BFS的真题,大家可以去看看前面两篇文章,对搜索讲的很详细.[一万字]蓝桥杯算法竞赛备考(一)--搜索专题 ...

  8. 2019.6.7 一场搜索专题的考试【including 洛谷·血色先锋队,入门OJ·兴建高铁,珠光宝气阁

    这次分数还好.但全是搜索题还没上200就有点打击人了--[本狸才177QAQ 血色先锋队/血色敢死队 传送门:洛谷P1332 & 入门OJ P2259 Description 邪魔天国领主复活 ...

  9. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

最新文章

  1. python实现冒泡排序完整算法_Python实现冒泡排序算法的完整实例
  2. 【一步步学小程序】1.创建项目以及TabBar
  3. Nginx做前端代理时缓存与否的性能差别
  4. android 悬浮窗权限,Android 悬浮窗权限校验
  5. arcxml 中 outputmode=xml 和 outputmode=newxml 的区别
  6. GridView显示图片
  7. 从严治码-系统集成项目之根本
  8. 人间不值得?250000条数据分析李诞是不是被骂火的
  9. 【Xamarin开发 Android 系列 1】环境部署搭建
  10. FishC笔记—33 讲 异常处理:你不可能总是对的2
  11. adventureworks mysql_AdventureWorks 示例数据库
  12. Google员工的工作环境
  13. python从srt文件中只提取歌词
  14. 到底是人穷志短,还是志短人穷?
  15. LUEVELSMEYER的PE文件格式
  16. PAT 乙级练习 1068 万绿丛中一点红 - 超级详细的思路讲解
  17. 《杀戮地带2》中的延迟渲染
  18. 晶晶的朋友(invite.cpp/c/pas)
  19. ASP 如何读取 Word 档案内容并显示于网页
  20. Android开发人员不得不收集的代码(持续更新中)(http://www.jianshu.com/p/72494773aace,原链接)

热门文章

  1. 计算机视觉方向简介 | 自动驾驶中的车道线跟踪技术
  2. 《机器学习》、《算法数据结构》、《LeetCode原创题解》开放下载!
  3. 基于OpenCV Haar实战级联分类器的使用
  4. ∇SLAM:自动可微分SLAM
  5. 【OpenCV 4开发详解】分割图像——分水岭法
  6. 阿里云文件存储极速型NAS产品介绍
  7. LongAdder解析
  8. 理解什么是MyBatis?
  9. 浅析 Node.js 的 vm 模块以及运行不信任代码
  10. iOS - UIStoryboard