洛谷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深度优先搜索例题分析的更多相关文章

  1. HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  2. HDU 4707 Pet(DFS(深度优先搜索)+BFS(广度优先搜索))

    Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  3. 回溯算法 DFS深度优先搜索 (递归与非递归实现)

    回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

  4. 『ACM C++』HDU杭电OJ | 1416 - Gizilch (DFS - 深度优先搜索入门)

    从周三课开始总算轻松了点,下午能在宿舍研究点题目啥的打一打,还好,刚开学的课程还算跟得上,刚开学的这些课程也是复习以前学过的知识,下半学期也不敢太划水了,被各种人寄予厚望之后瑟瑟发抖,只能努力前行了~ ...

  5. 步步为营(十五)搜索(一)DFS 深度优先搜索

    前方大坑预警! 先讲讲什么是搜索吧. 有一天你去一个果园摘梨子,果农告诉你.有一棵树上有一个金子做的梨子,找到就是你的,你该怎么找? 地图例如以下: S 0 0 0 0 0 0 0 0 0 0 0 0 ...

  6. [算法总结]DFS(深度优先搜索)

    目录 一.关于DFS 1. 什么是DFS 2. DFS的搜索方式 二.DFS的具体实现 三.剪枝 1. 顺序性剪枝 2. 重复性剪枝 3. 可行性剪枝 4. 最优性剪枝 5. 记忆化剪枝 四.练习 一 ...

  7. 回溯 DFS 深度优先搜索[待更新]

      首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权!   1.概念   回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别 ...

  8. DFS——深度优先搜索的一般格式

    DFS是一种深度优先的搜索思想,运用递归完成搜索,本质上也算是穷举思想的一类,可以通过剪枝进行优化. DFS的核心是回溯和递归, 如果以迷宫为例,一般会指定走各个方向的顺序(例如先左再上再右再下).从 ...

  9. ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)

     小鼠迷宫问题 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 1  Solved: 1 [Submit][Status][Web Board] Desc ...

随机推荐

  1. PHP全栈开发(一):CentOS 7 配置LAMP

    服务器CentOS7 IP地址:10.28.2.249 进行网络配置 可以使用ip address命令查看当前的网卡状态 两张网卡,一张lo网卡一张ens160网卡 Ens160这个网卡的配置文件为/ ...

  2. 01-MySQL8主从详解

    主从原理 master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中:slave服务器会在一定时间间隔内对master二进制日志进行探测其是 ...

  3. 如何使用IDEA自动生成类图

    然后再类里边按 Ctrl+Alt+U 然后就会生成类图,这个样子 然后怎样把生成的类图搞出来.当然是使用截图软件啦.微信上的截图软件和qq上的截图软件好像都不在阔以,你一点击截图按钮.生成的类图就会消 ...

  4. java集合框架复习----(3)Set

    文章目录 四.set集合 1.hashSet[重点] 2.TreeSet 四.set集合 无序.无下标.元素不可重复 1.hashSet[重点] == 数组+链表+红黑树== 基于hashcode计算 ...

  5. 解决ffmpeg的播放摄像头的延时优化问题(项目案例使用有效)

    在目前的项目中使用了flv的播放摄像头的方案,但是延时达到了7-8秒,所以客户颇有微词,没有办法,只能开始优化播放延时的问题,至于对接摄像头的方案有好几种,这种咱们以后在聊,今天只要聊聊聊优化参数的问 ...

  6. Linux的挖矿木马病毒清除(kswapd0进程)

    1.top查看资源使用情况 看到这些进程一直在变化,但是,主要是由于kswapd0进程在作怪,占据了99%以上的CUP,查找资料后,发现它就是挖矿进程 2.排查kswapd0进程 执行命令netsta ...

  7. 论文笔记 - Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity

    prompt 的影响因素 Motivation Prompt 中 Example 的排列顺序对模型性能有较大影响(即使已经校准参见好的情况下,选取不同的排列顺序依然会有很大的方差): 校准可以大幅度提 ...

  8. python 的time、datetime模块

    python 时间模块 import datetime ​ res = datetime.datetime.now() print(res) # 2022-08-07 16:47:07.120459 ...

  9. 廖---list tuple dic set

    list 有序集合,可随时添加和删除其中的数据. 在 Python 列表中删除元素主要分为以下 3 种场景: 根据目标元素所在位置的索引进行删除,可以使用 del 关键字或者 pop() 方法: 根据 ...

  10. day12-Servlet02

    Servlet02 6.GET和POST请求的分发处理 开发Servlet,通常编写doGet,doPost方法.来对表单的get和post请求进行分发处理 例子 在web文件夹下面创建一个html页 ...