DFS深度优先搜索例题分析
洛谷P1596 Lake Counting S
题面翻译
由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 \(N\times M(1\times N\times 100, 1\leq M\leq 100)\) 的网格图表示。每个网格中有水(W) 或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。
输入第 \(1\) 行:两个空格隔开的整数:\(N\) 和 \(M\)。
第 \(2\) 行到第 \(N+1\) 行:每行 \(M\) 个字符,每个字符是 W 或 .,它们表示网格图中的一排。字符之间没有空格。
输出一行,表示水坑的数量。
输入格式
Line 1: Two space-separated integers: N and M * Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.
输出格式
Line 1: The number of ponds in Farmer John's field.
题目分析
明显的八方向DFS题,主要过程与连通块问题模板基本一致,伪代码如下:
void dfs(int step,参数表){
自定义参数;
if(目标状态){
输出解/作计数、评价处理;
}
for(int i=1;i<=状态的拓展可能数;i++){
if(第i种状态拓展可行){
维护自定义参数;
dfs(step+1,参数表);
}
}
}
特别的,连通块问题记得对经过的点染色标记。
AC题解
#include<bits/stdc++.h>
using namespace std;
int n,m,dx[9]={0,0,1,1,1,0,-1,-1,-1},dy[9]={0,-1,-1,0,1,1,1,0,-1},ans=0; //打表
char s[200][200];
void dfs(int p, int q){
for(int i=1;i<=8;i++){
if(s[p+dx[i]][q+dy[i]]=='W'){
s[p+dx[i]][q+dy[i]]='.';
dfs(p+dx[i],q+dy[i]);
}
}
}
int main(){
memset(s,'.',sizeof(s));
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
getchar();
for(int j=1;j<=m;j++){
scanf("%c",&s[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s[i][j]=='W'){
ans++;
s[i][j]='.';
dfs(i,j);
}
}
}
printf("%d",ans);
return 0;
}
#1239 字符序列
题目描述
从三个元素的集合[A,B,C]中选取元素生成一个N 个字符组成的序列,使得没有两个相邻的连续子序列相同,例:N=5时ABCBA 是合格的,而序列ABCBC与ABABC是不合格的,因为其中子序列BC,AB 是相同的。
输入格式
一个正整数N(1<=N<=15)。
输出格式
满足条件的N字符的序列总数。
题目分析
要点在于判断重复字符串,所以最好还要定义一个bool型函数check方便处理。
AC题解
#include<bits/stdc++.h>
using namespace std;
int n,ans;
char s[4]={'z','A','B','C'},tp[1000];
bool check(int step,int k){
bool flag=1;
tp[step]=s[k]; //将待处理的地方先赋值
for(int len=2;len<=step/2;len++){ //剪枝,从长度2开始遍历
flag=1;
for(int i=0;i<len;i++){
if(tp[step-i]!=tp[step-len-i]){
flag=0; //染色
break;
}
}
if(flag==1){
tp[step]='0';
return 0;
}
}
return 1;
}
void dfs(int step){
if(step>n){
ans++;
return ;
}
for(int i=1;i<=3;i++){
if(tp[step-1]!=s[i]&&check(step,i)){
dfs(step+1);
tp[step]='0';
}
}
}
int main(){
memset(tp,'0',sizeof(tp));
scanf("%d",&n);
dfs(1);
printf("%d",ans);
return 0;
}
DFS深度优先搜索例题分析的更多相关文章
- HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 4707 Pet(DFS(深度优先搜索)+BFS(广度优先搜索))
Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...
- 回溯算法 DFS深度优先搜索 (递归与非递归实现)
回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...
- 『ACM C++』HDU杭电OJ | 1416 - Gizilch (DFS - 深度优先搜索入门)
从周三课开始总算轻松了点,下午能在宿舍研究点题目啥的打一打,还好,刚开学的课程还算跟得上,刚开学的这些课程也是复习以前学过的知识,下半学期也不敢太划水了,被各种人寄予厚望之后瑟瑟发抖,只能努力前行了~ ...
- 步步为营(十五)搜索(一)DFS 深度优先搜索
前方大坑预警! 先讲讲什么是搜索吧. 有一天你去一个果园摘梨子,果农告诉你.有一棵树上有一个金子做的梨子,找到就是你的,你该怎么找? 地图例如以下: S 0 0 0 0 0 0 0 0 0 0 0 0 ...
- [算法总结]DFS(深度优先搜索)
目录 一.关于DFS 1. 什么是DFS 2. DFS的搜索方式 二.DFS的具体实现 三.剪枝 1. 顺序性剪枝 2. 重复性剪枝 3. 可行性剪枝 4. 最优性剪枝 5. 记忆化剪枝 四.练习 一 ...
- 回溯 DFS 深度优先搜索[待更新]
首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权! 1.概念 回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别 ...
- DFS——深度优先搜索的一般格式
DFS是一种深度优先的搜索思想,运用递归完成搜索,本质上也算是穷举思想的一类,可以通过剪枝进行优化. DFS的核心是回溯和递归, 如果以迷宫为例,一般会指定走各个方向的顺序(例如先左再上再右再下).从 ...
- ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)
小鼠迷宫问题 Time Limit: 2 Sec Memory Limit: 64 MB Submit: 1 Solved: 1 [Submit][Status][Web Board] Desc ...
随机推荐
- P7114 [NOIP2020] 字符串匹配 (字符串hash+树状数组)
好多题解用的扩展KMP(没学过,所以不用这种方法). 我们按照题目要求记F(s)表示s串的权值,可以预处理出前缀权值(用于A)和后缀权值(用于C),枚举AB的长度i=2~n-1,不需要分开枚举,我们只 ...
- HDU4991 Ordered Subsequence (树状数组优化DP)
dp[i][j]表示以a[i]结尾的长度为j的上升子序列个数. 方程:dp[i][j]=sum(dp[k][j-1]),a[k]<a[i],1<=k<i. 求解目标:sum(dp[k ...
- 一文读懂 MySQL 索引
1 索引简介 1.1 什么是 MySQL 的索引 官方定义:索引是帮助 MySQL 高效获取数据的数据结构 从上面定义中我们可以分析出索引本质是一个数据结构,他的作用是帮助我们高效获取数据,在正式介绍 ...
- 《Vue3.x+TypeScript实践指南》已出版
转眼回长沙快2年了,图书本在去年就已经完稿,因为疫情,一直耽搁了,直到这个月才出版!疫情之下,众生皆苦!感觉每天都是吃饭.睡觉.上班.做核酸! 图书介绍 为了紧跟技术潮流,该书聚焦于当下火的Vue3和 ...
- [Mysql] 两段提交
事务提交 Mysql 默认开启自动提交事务 两段提交 把一个事务分成两个阶段来提交,就是把redolog拆分成了prepare和commit两段 MySQL想要准备事务的时候会先写redolog.bi ...
- Python学习笔记----操作字符串
1.字符串相加.列表相加.列表和字符串不能混着使用 #序列相加 a="hello" b="python" c=a+b print("字符串相加的结果& ...
- LeetCode------移动零(5)【数组】
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/move-zeroes 1.题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末 ...
- 齐博x1再来个抛砖引玉 内容页根据关键词调用相关内容 新功能哦!
昨天升级了一个隐藏的功能,今天就简单的做个说明怎么用,反正也不能浪费不是 那就用内容页面关键词读取相关内容为例吧. 前台是你模型中已经存在keywords字段 关键词支持 空格分割,号分割 那么就开 ...
- 17_Vue列表过滤_js模糊查询
列表过滤 需求分析 这里呢有张列表,假设这个列表有一百多条数据 当我在这个 搜索框当中 搜索 单个关键字的时候 (冬,周,伦),它能把带了这几个关键字的信息都给我罗列出来 === 跟数据库的 模糊查询 ...
- iOS- 最全的真机测试教程
想要上架的同学请看:<iOS-最全的App上架教程> 因为最近更新了Xcode 8 ,证书的创建都大同小异,只是在Xcode 8中的设置有一些变化,我就在下面补充,如有什么疑问,请联系 ...