当前位置: 首页 > news >正文

打卡52天------图论(应用题)

一、孤岛的总面积

基础题目 可以自己尝试做一做 。

代码随想录

const r1 = require('readline').createInterface({ input: process.stdin });
// 创建readline接口
let iter = r1[Symbol.asyncIterator]();
// 创建异步迭代器
const readline = async () => (await iter.next()).value;let graph // 地图
let N, M // 地图大小
let count = 0 // 孤岛的总面积
const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向// 读取输入,初始化地图
const initGraph = async () => {let line = await readline();[N, M] = line.split(' ').map(Number);graph = new Array(N).fill(0).map(() => new Array(M).fill(0))for (let i = 0; i < N; i++) {line = await readline()line = line.split(' ').map(Number)for (let j = 0; j < M; j++) {graph[i][j] = line[j]}}
}/*** @description: 从(x,y)开始深度优先遍历地图* @param {*} graph 地图* @param {*} x 开始搜索节点的下标* @param {*} y 开始搜索节点的下标* @return {*}*/
const dfs = (graph, x, y) => {if(graph[x][y] === 0) returngraph[x][y] = 0 // 标记为海洋for (let i = 0; i < 4; i++) {let nextx = x + dir[i][0]let nexty = y + dir[i][1]if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continuedfs(graph, nextx, nexty)}
}(async function () {// 读取输入,初始化地图await initGraph()// 遍历地图左右两边for (let i = 0; i < N; i++) {if (graph[i][0] === 1) dfs(graph, i, 0)if (graph[i][M - 1] === 1) dfs(graph, i, M - 1)}// 遍历地图上下两边for (let j = 0; j < M; j++) {if (graph[0][j] === 1) dfs(graph, 0, j)if (graph[N - 1][j] === 1) dfs(graph, N - 1, j)}count = 0// 统计孤岛的总面积for (let i = 0; i < N; i++) {for (let j = 0; j < M; j++) {if (graph[i][j] === 1) count++}}console.log(count);
})()

二、沉没孤岛

和上一题差不多,尝试自己做做

代码随想录

const r1 = require('readline').createInterface({ input: process.stdin });
// 创建readline接口
let iter = r1[Symbol.asyncIterator]();
// 创建异步迭代器
const readline = async () => (await iter.next()).value;let graph // 地图
let N, M // 地图大小
const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向// 读取输入,初始化地图
const initGraph = async () => {let line = await readline();[N, M] = line.split(' ').map(Number);graph = new Array(N).fill(0).map(() => new Array(M).fill(0))for (let i = 0; i < N; i++) {line = await readline()line = line.split(' ').map(Number)for (let j = 0; j < M; j++) {graph[i][j] = line[j]}}
}/*** @description: 从(x,y)开始深度优先遍历地图* @param {*} graph 地图* @param {*} x 开始搜索节点的下标* @param {*} y 开始搜索节点的下标* @return {*}*/
const dfs = (graph, x, y) => {if (graph[x][y] !== 1) returngraph[x][y] = 2 // 标记为非孤岛陆地for (let i = 0; i < 4; i++) {let nextx = x + dir[i][0]let nexty = y + dir[i][1]if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continuedfs(graph, nextx, nexty)}
}(async function () {// 读取输入,初始化地图await initGraph()// 遍历地图左右两边for (let i = 0; i < N; i++) {if (graph[i][0] === 1) dfs(graph, i, 0)if (graph[i][M - 1] === 1) dfs(graph, i, M - 1)}// 遍历地图上下两边for (let j = 0; j < M; j++) {if (graph[0][j] === 1) dfs(graph, 0, j)if (graph[N - 1][j] === 1) dfs(graph, N - 1, j)}// 遍历地图,将孤岛沉没,即将陆地1标记为0;将非孤岛陆地2标记为1for (let i = 0; i < N; i++) {for (let j = 0; j < M; j++) {if (graph[i][j] === 1) graph[i][j] = 0else if (graph[i][j] === 2) graph[i][j] = 1}console.log(graph[i].join(' '));}
})()

三、水流问题

需要点优化思路,建议先自己读题,相处一个解题方法,有时间就自己写代码,没时间就直接看题解,优化方式 会让你 耳目一新。

代码随想录

const r1 = require('readline').createInterface({ input: process.stdin });
// 创建readline接口
let iter = r1[Symbol.asyncIterator]();
// 创建异步迭代器
const readline = async () => (await iter.next()).value;let graph // 地图
let N, M // 地图大小
const dir = [[0, 1], [1, 0], [0, -1], [-1, 0]] //方向// 读取输入,初始化地图
const initGraph = async () => {let line = await readline();[N, M] = line.split(' ').map(Number);graph = new Array(N).fill(0).map(() => new Array(M).fill(0))for (let i = 0; i < N; i++) {line = await readline()line = line.split(' ').map(Number)for (let j = 0; j < M; j++) {graph[i][j] = line[j]}}
}/*** @description: 从(x,y)开始深度优先遍历地图* @param {*} graph 地图* @param {*} visited 可访问节点* @param {*} x 开始搜索节点的下标* @param {*} y 开始搜索节点的下标* @return {*}*/
const dfs = (graph, visited, x, y) => {if (visited[x][y]) returnvisited[x][y] = true // 标记为可访问for (let i = 0; i < 4; i++) {let nextx = x + dir[i][0]let nexty = y + dir[i][1]if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M) continue //越界,跳过if (graph[x][y] < graph[nextx][nexty]) continue //不能流过.跳过dfs(graph, visited, nextx, nexty)}
}/*** @description: 判断地图上的(x, y)是否可以到达第一组边界和第二组边界* @param {*} x 坐标* @param {*} y 坐标* @return {*} true可以到达,false不可以到达*/
const isResult = (x, y) => {let visited = new Array(N).fill(false).map(() => new Array(M).fill(false))let isFirst = false //是否可到达第一边界let isSecond = false //是否可到达第二边界// 深搜,将(x, y)可到达的所有节点做标记dfs(graph, visited, x, y)// 判断能否到第一边界左边for (let i = 0; i < N; i++) {if (visited[i][0]) {isFirst = truebreak}}// 判断能否到第一边界上边for (let j = 0; j < M; j++) {if (visited[0][j]) {isFirst = truebreak}}// 判断能否到第二边界右边for (let i = 0; i < N; i++) {if (visited[i][M - 1]) {isSecond = truebreak}}// 判断能否到第二边界下边for (let j = 0; j < M; j++) {if (visited[N - 1][j]) {isSecond = truebreak}}return isFirst && isSecond
}(async function () {// 读取输入,初始化地图await initGraph()// 遍历地图,判断是否能到达第一组边界和第二组边界for (let i = 0; i < N; i++) {for (let j = 0; j < M; j++) {if (isResult(i, j)) console.log(i + ' ' + j);}}
})()

四、建造最大岛屿

同样优化思路也会让你耳目一新,自己想比较难想出来。

代码随想录

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 钉钉群消息提醒
  • Python -- GUI图形界面编程—GUI编程实例 博主也在持续学习中[ 持续更新中!!! 欢迎白嫖 ]
  • Python编程进阶题
  • centos彻底卸载docker服务
  • [笔记]基于小波分析的基频识别
  • 前端:html+css:伪类画箭头(实心)
  • 一般图最大权匹配
  • 前端面试——什么是原型和原型链
  • 这个暑假作业有点特别,帮100位老人开启这个功能
  • 一个很大的文件,文件的每一行是一个很大的数字,如果给你一个单机,内存比较小,存不了这么大的文件,但是硬盘是无限大的,如何对文件做一个排序输出
  • K8S部署MySQL5.7的主从服务
  • MFC程序设计(三)常用复杂控件的使用
  • 从零到上线,乔拓云助力快速构建在线教育平台
  • 【面试题系列Vue05】跟其他人不太一样的 Vue生命周期总结
  • 文案生成器,快速生成改写文案的捷径
  • [译] React v16.8: 含有Hooks的版本
  • Android优雅地处理按钮重复点击
  • DOM的那些事
  • javascript 总结(常用工具类的封装)
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Next.js之基础概念(二)
  • node入门
  • Python十分钟制作属于你自己的个性logo
  • 基于组件的设计工作流与界面抽象
  • 排序(1):冒泡排序
  • 前端路由实现-history
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 深度学习在携程攻略社区的应用
  • 通信类
  • ​secrets --- 生成管理密码的安全随机数​
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (Java)【深基9.例1】选举学生会
  • (zhuan) 一些RL的文献(及笔记)
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)linux下的时间函数使用
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @SuppressWarnings(unchecked)代码的作用
  • [ solr入门 ] - 利用solrJ进行检索
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [acm算法学习] 后缀数组SA
  • [ACP云计算]组件介绍