蹄它
时间:2025-01-13 10:15:23 172浏览 收藏
学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《蹄它》,以下内容主要包含等知识点,如果你正在学习或准备学习文章,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

代码来临 2024 年第 10 天
第 1 部分
初探恐惧,继而兴奋
我习惯于先快速浏览一遍,再仔细阅读。
今天,我看到:
- 网格
- 以及看似路径的元素
我担心这会是另一个最短路径难题。
然后我读懂了题意。
松了口气……至少第一部分是这样。
我需要找到所有有效的路径。
这……我能做到!
从 0 开始
我必须找到所有数字 0:
input = input
.split('\n')
.map(
line => line.split('').map(char => +char)
);
let zeros = [];
for (let r = 0; r < input.length; r++) {
for (let c = 0; c < input[0].length; c++) {
if (input[r][c] === 0) {
zeros.push([r, c]);
}
}
}
0:找到!
尝试递增移动
从每个 0 开始,有效的路径包含九个步骤,每个数字都比前一个大 1,最终以 9 结束。
这听起来像是递归的应用场景。
我需要一个基本情况:
- 当前数字不比前一个数字大 1
- 当前数字是 9
我的算法工作流程如下:
- 起始数字
- 当前坐标
获取当前数字
如果它不比起始数字恰好大 1 返回 false 否则 如果它是 9 返回当前坐标 如果它不是 9 继续检查正交方向上的坐标
现在写完了,我意识到漏掉的部分是跟踪有效结束坐标的记录。
我为此纠结了一段时间。
我不断收到错误,错误地让我认为我无法传入 Set 甚至数组。
但幸运的是,我只是忘记将其传递给递归函数的后续调用。
这是我最终的递归算法:
let dirs = [[-1,0],[0,-1],[0,1],[1,0]];
function pathfinder(num, coord, memo) {
let current = input[coord[0]][coord[1]];
if (current - num !== 1) {
return false;
} else if (current == 9) {
memo.add(coord.join(','));
return;
} else {
dirs.forEach(dir => {
let newCoord = [coord[0] + dir[0], coord[1] + dir[1]];
if (
newCoord[0] >= 0 &&
newCoord[0] < input.length &&
newCoord[1] >= 0 &&
newCoord[1] < input[0].length &&
!memo.has(newCoord.join(','))
) {
pathfinder(current, newCoord, memo);
}
});
}
}
因为我必须从 0 坐标开始,所以我的第一次调用使用 -1:
pathfinder(-1, zerocoordinate, matches);
最后,为了得到正确的结果,我迭代每个零,生成唯一的目标 9 集合,保留并总结集合的大小:
let part1 = zeros.map(z => {
let matches = new Set();
pathfinder(-1, z, matches);
return matches.size;
}).reduce((a, c) => a + c);
快速测试,快速结果
它为小的示例输入生成了正确的答案。
对于更大的示例输入。
还有……
……我的谜题输入!!!
耶!!!
第二部分会带来什么挑战呢?
第 2 部分
嗯,这似乎太简单了
我在第一部分编写算法的方式是否意味着只需要进行一些小的修改就能得到正确的答案?
数一数吧!
现在,我将每个有效的 9 添加到一个集合中。
对于第二部分,我想我只需要为每个有效的 9 增加一个计数器。
值得一试!
将 Set 更改为数组,瞧!
示例的正确答案。
我的谜题输入的正确答案。
哇。哇。哇。
第二天……这可能会更难。
本篇关于《蹄它》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
374 收藏
-
422 收藏
-
449 收藏
-
105 收藏
-
285 收藏
-
111 收藏
-
文章 · 前端 | 1星期前 | 定时器 · 前端 · 性能排查 · 接口请求 · 轮询 · setInterval · setInterval 页面可见性 clearInterval 前端轮询 请求堆积 定时器清理490 收藏
-
253 收藏
-
295 收藏
-
128 收藏
-
365 收藏
-
350 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习