C语言洛谷题目分享(8)入门和Lake Counting S

1.前言

大家好啊,今天继续为大家分享俩道洛谷dfs的题目,希望能对大家有所帮助。

2.俩道题目

1.入门(P1683)

1.题目描述

不是任何人都可以进入桃花岛的,黄药师最讨厌像郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻的四块瓷砖中的任何一个上,但它也必须是安全的才行。

由于你是黄蓉的朋友,她事先告诉你哪些砖是安全的、哪些砖是不安全的,并且她会指引你飞到第一块砖上(第一块砖可能在任意安全位置),现在她告诉你进入桃花岛的秘密就是:如果你能走过最多的瓷砖并且没有死,那么桃花岛的大门就会自动打开了,你就可以从当前位置直接飞进大门了。

注意:瓷砖可以重复走过,但不能重复计数。

2.输入格式

第一行两个正整数 W 和 H,分别表示小路的宽度和长度。

以下 H 行为一个 H×W 的字符矩阵。每一个字符代表一块瓷砖。其中   . 代表安全的砖,# 代表不安全的砖,@ 代表第一块砖。

3.输出格式

输出一行,只包括一个数,即你从第一块砖开始所能安全走过的最多的砖块个数(包括第一块砖)。

4.输入输出样例

5.说明/提示

数据规模与约定

对于全部的测试点,保证 1≤W,H≤20。

6.题解

#include<iostream>
#include<algorithm>
using namespace std;

const int N=30;

int w=0,h=0;
int res=0;
bool st[N][N];
char m[N][N];//创建地图
int dx[4]={-1,0,1,0};//向量数组x
int dy[4]={0,1,0,-1};//向量数组y

void dfs(int x,int y){
    for(int i=0;i<4;i++){
        int a=x+dx[i];int b=y+dy[i];
        if(a>=h||b>=w||a<0||b<0)continue;//判断是否越界
        if(m[a][b]!='.')continue;//判断是否为.
        if(st[a][b])continue;//判断是否走过
        
        st[a][b]=true;//用于记录这个路是否走过
        res++;//记录方案
        dfs(a,b);//不需要回溯
    }
}

int main(){
    scanf("%d%d",&w,&h);
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            scanf(" %c",&m[i][j]);
            
        }//双重循环输入地图
    }
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            if(m[i][j]=='@'){  //寻找入口
                st[i][j]=true;
                dfs(i,j);
            }
            
        }
    }
    res++;
    printf("%d",res);
    return 0;
}
  • 这道题的整体思路就是先利用循环输入地图
  • 再利用一个双重循环寻找入口
  • 找到入口后开始搜索这道题比较高明的地方就是创建一个向量数组(不用这个就要指数搜索啦,时间会比较长)
  • 接着三个判断条件:1.是否越界。2.是否为可走的道路3.是否为已走过的道路。
  • 都满足后记录res并继续搜索,最后打印即可

 2.Lake Counting S(P1596)

1.题目描述

Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors. Given a diagram of Farmer John's field, determine how many ponds he has.

2.输入格式

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.

3.输出格式

Line 1: The number of ponds in Farmer John's field.

4.题意翻译

由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 N×M(1≤N≤100,1≤M≤100) 的网格图表示。每个网格中有水(W) 或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。

输入第 1 行:两个空格隔开的整数:N 和 M。

第 2 行到第 N+1 行:每行 M 个字符,每个字符是 W 或 .,它们表示网格图中的一排。字符之间没有空格。

输出一行,表示水坑的数量。

5.输入输出样例

6.题解

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N=110;
int n=0,m=0;
int res=0;
char ma[N][N];
bool st[N][N];
int dx[8]={1,1,1,0,0,-1,-1,-1};//创建向量数组
int dy[8]={-1,0,1,1,-1,1,0,-1};

void dfs(int x,int y){
    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(ma[a][b]!='W')continue;
        if(st[a][b])continue;
        
        st[a][b]=true;
        dfs(a,b);//不用回溯
    }
    return ;
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%s",ma[i]);//输入地图
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(ma[i][j]=='W'&&!st[i][j]){
                dfs(i,j);
                res++;
            }
            
        }
    }
    printf("%d\n",res);
    return 0;
}
  • 这道题思路跟上一题有些类似,但更加复杂了一点。
  • 还是先利用循环输入地图(这里直接利用单一循环输入字符数组,时间会更快)。
  • 接着利用双重循环寻找第一个水坑位置,开始搜索。
  • 从第一个水坑位置开始,开始寻找最多能蔓延到的其他位置(继续利用向量数组),做好标记,保证该水坑最大时搜索结束,水坑数加1。
  • 继续在双重循环里面遍历寻找下一个能够注水的地方,依此类推最后输出res即可。

3.小结

今天的分享到这里就结束咯,大家喜欢的话就多多支持吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/534601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

U盘加密系统(U盘加密全攻略)

U盘加密系统是一种专门设计用于保护U盘数据安全的软件系统。 企业要对U盘进行加密的原因主要有以下几点&#xff1a; 首先&#xff0c;U盘作为一种移动存储设备&#xff0c;在企业内部和外部的数据传输中扮演着重要角色。 然而&#xff0c;由于其便携性和易失性&#xff0c;…

vue实现海康h5player问题汇总

1. 引入问题 最开始写的时候&#xff0c;把h5player封装成了一个组件&#xff0c;把资源文件随便放在了一个目录下&#xff0c; 直接在子组件中引入&#xff0c;报错window.JSPlugin is not a constructor 或者JSPlugin is not defined 初步分析应该是引入资源文件失败&#x…

基于springboot+vue实现的高校宿舍管理系统(界面优美,十分推荐)

一、项目简介 本项目是一套基于springbootvue实现的高校宿舍管理系统设计与实现 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观…

解密辛普森悖论:如何在数据分析中保持清醒头脑

解密辛普森悖论&#xff1a;如何在数据分析中保持清醒头脑 之前也参加fine Bi的 培训&#xff0c;学到了辛普森悖论&#xff0c;今天为大家介绍一下 文章目录 解密辛普森悖论&#xff1a;如何在数据分析中保持清醒头脑前言我们来举一个例子数据分析解释管理应用的启示 前言 什…

使用hexo+gitee从零搭建个人博客

一、环境准备 1.Node.js&#xff1a;下载 | Node.js 中文网 (nodejs.cn) &#xff0c;Hexo 是基于Node.js 的博客框架 教程&#xff1a;https://blog.csdn.net/weixin_52799373/article/details/123840137 node -v npm -v 安装 Node.js 淘宝镜像加速器 &#xff08;cnpm&am…

python中的异常

1、NoSuchElementException 找不到元素 2、ElementNotInteractableException 元素无法交互 可能原因1&#xff1a;元素定位到以后&#xff0c;无法点击---元素未渲染完 解決&#xff1a;使用expected_conditions模块下的element_to_be_clickable来判断元素是否可被点击&#…

二叉树应用——最优二叉树(Huffman树)、贪心算法—— Huffman编码

1、外部带权外部路径长度、Huffman树 从图中可以看出&#xff0c;深度越浅的叶子结点权重越大&#xff0c;深度越深的叶子结点权重越小的话&#xff0c;得出的带权外部路径长度越小。 Huffman树就是使得外部带权路径最小的二叉树 2、如何构造Huffman树 &#xff08;1&#xf…

“筑爱助残 快乐出游”带残疾人之家的残疾人出游活动

为拓宽残疾人的视野、增强残疾人的自信和勇气&#xff0c;感受外面世界的美好和多彩&#xff0c;帮助他们融入社会拥抱大自然&#xff0c;重拾美好生活的信心&#xff0c;营造残健互助的社会氛围。4月10日&#xff0c;嘉善蒲公英志愿者团队组织爱心司机开展以“筑爱助残 快乐出…

openGauss学习笔记-260 openGauss性能调优-使用Plan Hint进行调优-同层参数化路径的Hint

文章目录 openGauss学习笔记-260 openGauss性能调优-使用Plan Hint进行调优-同层参数化路径的Hint260.1 功能描述260.2 语法格式260.3 示例 openGauss学习笔记-260 openGauss性能调优-使用Plan Hint进行调优-同层参数化路径的Hint 260.1 功能描述 通过predpush_same_level Hi…

linux下如何查看防火墙状态

systemctl status firewalld (看防火墙进程) cat /etc/selinux/config (看是否启用linux安全模式)

【Python】控制台进度条

在Python开发中&#xff0c;有时需要向用户展示一个任务的进度&#xff0c;以提供更好的交互体验。下面我将展示如何使用Python来创建一个简单的控制台进度条。 效果&#xff1a; 代码&#xff1a; import time import sys def print_progress_bar(completed, total, length…

蓝桥杯省赛冲刺(3)广度优先搜索

广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是一种在图或树等非线性数据结构中遍历节点的算法&#xff0c;它从起始节点开始&#xff0c;按层级逐步向外扩展&#xff0c;即先访问离起始节点最近的节点&#xff0c;再访问这些节点的邻居&#xff0c;然后是邻…

Kyligence 发布企业级 AI 解决方案,Data + AI 落地迈向新阶段

4月11日&#xff0c;Kyligence 2024 数智论坛暨春季发布会成功召开。Kyligence 正式发布全新的企业级 AI 解决方案&#xff0c;基于服务金融、零售、制造、医药等行业领先客户的落地实践&#xff0c;Kyligence 为企业提供准确、可靠、智能的 AI 指标平台一站式解决方案&#x…

头歌-机器学习 第10次实验 逻辑回归

第1关&#xff1a;逻辑回归核心思想 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的编程题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 什么是逻辑回归&#xff1b; sigmoid函数。 什么是逻辑回归 当一看到“回归”这两个字&a…

Harmony鸿蒙南向驱动开发-CLOCK接口使用

CLOCK&#xff0c;时钟是系统各个部件运行的基础&#xff0c;以CPU时钟举例&#xff0c;CPU 时钟是指 CPU 内部的时钟发生器&#xff0c;它以频率的形式工作&#xff0c;用来同步和控制 CPU 内部的各个操作。 CLOCK接口定义了完成CLOCK操作的通用方法集合&#xff0c;包括&…

五一出游 请带上我。必备全家桶。出游变成搬家。千里快递员,这样的人就不要带了。学习过后,你会使用这些句子了吗?

五一出游&#xff0c;即劳动节假期出游&#xff0c;需要准备的物品会根据旅行的目的地、天气状况、交通方式和个人习惯有所不同。以下是一个基本的全家桶必备物品清单&#xff1a; 一、 证件类&#xff1a; 身份证驾驶证&#xff08;如果自驾&#xff09;护照/港澳通行证/台…

递归、搜索与回溯算法:递归

递归 在解决⼀个规模为n的问题时&#xff0c;如果满⾜以下条件&#xff0c;我们可以使⽤递归来解决&#xff1a; a. 问题可以被划分为规模更⼩的⼦问题&#xff0c;并且这些⼦问题具有与原问题相同的解决⽅法。 b. 当我们知道规模更⼩的⼦问题&#xff08;规模为 n - 1&…

MySQL事务、主从、分库分表常见面试题

文章目录 1.事务的特性2.并发事务问题&#xff0c;如何解决&#xff0c;默认隔离级别3.undo log和redo log的区别4.事务中的隔离性是如何保证的&#xff08;解释一下MVCC&#xff09;5.主从同步原理6.分库分表 1.事务的特性 2.并发事务问题&#xff0c;如何解决&#xff0c;默认…

Windows部署ChatGLM3步骤

一、环境要求 硬件 内存&#xff1a;> 16GB 显存: > 13GB&#xff08;4080 16GB&#xff09; 软件 python 版本推荐3.10 - 3.11 transformers 库版本推荐为 4.36.2 torch 推荐使用 2.0 及以上的版本&#xff0c;以获得最佳的推理性能 二、部署步骤 1、新建pytho…

无缝集成:使用Spring Boot和Vue实现头像上传与回显功能

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…