<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>未分类 on 一共十七划</title>
		<link>https://noirzh.com/categories/%E6%9C%AA%E5%88%86%E7%B1%BB/</link>
		<description>Recent content in 未分类 on 一共十七划</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Mon, 13 Nov 2023 09:23:49 +0800</lastBuildDate>
		
			<atom:link href="https://noirzh.com/categories/%E6%9C%AA%E5%88%86%E7%B1%BB/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>题解-逃离火灾-两次BFS-在路上不会被烧到,处理边界</title>
				<link>https://noirzh.com/solution-escape-the-spreading-fire/</link>
				<pubDate>Thu, 09 Nov 2023 09:23:43 +0800</pubDate>
				<guid>https://noirzh.com/solution-escape-the-spreading-fire/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;Problem: [2258. 逃离火灾](https://leetcode.cn/problems/escape-the-spreading-fire/description/)&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;p&gt;&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;思路&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;– 由题意可知需要计算一条最短路,耗时最短以保证后续火传过来的时候让火传递的时间足够长来接近答案&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 火的蔓延时间用DFS求解,可以求出来火到各个节点的最少用时&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 应该考虑每次刷新一下出发时间来看此次最短路是否被烧掉吗?其实不用&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    – 只需要考虑在终点人能否比火早到即可&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    – 假如人在路上遇到火,则火到终点的用时一定小于等于人&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 保证了到终点的时候火耗时大于人可以反推出&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    1. 人和火相遇的路都能保证有如此长的等待时间&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    2. 若人和火不相遇则显然&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;细节&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;1. 如果起点起火不可达&lt;/p&gt;&#xD;&#xA;&lt;p&gt;2. 对于只有人可达的情况,是等待多久都可以的情况&lt;/p&gt;&#xD;&#xA;&lt;p&gt;3. 重点:因为允许人和火同时进安全屋,但是不能要求其他格子里人和火同时到&lt;/p&gt;&#xD;&#xA;&lt;p&gt;    1. 考虑将终点旁边的两格当做终点,如果他们到达终点所剩下的时间大于等于1,显然可以在外面等一分钟&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;解题方法&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;– 两遍BFS求火和人到各个节点的距离&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 对于起点和终点的几种情况特判&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 查询以终点左边和上边的点是否允许多等一分钟&lt;/p&gt;&#xD;&#xA;&lt;p&gt;– 返回答案&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;/h2&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:&#xD;&#xA;    def maximumMinutes(self, grid: List[List[int]]) -&amp;gt; int:&#xD;&#xA;        n=len(grid[0])&#xD;&#xA;        m=len(grid)&#xD;&#xA;        times=[[0x7fffffff]*n for _ in range(m)]&#xD;&#xA;        q=deque()&#xD;&#xA;        directions=[[0,-1],[0,1],[1,0],[-1,0]]&#xD;&#xA;        for i in range(m):&#xD;&#xA;            for j in range(n):&#xD;&#xA;                if grid[i][j]==1:&#xD;&#xA;                    q.append([i,j])&#xD;&#xA;                elif grid[i][j]==2:&#xD;&#xA;                    times[i][j]=-1#不可达&#xD;&#xA;        now=0&#xD;&#xA;        h=set()  &#xD;&#xA;        while q:&#xD;&#xA;            length=len(q)&#xD;&#xA;            for _ in range(length):&#xD;&#xA;                i,j=q.popleft()&#xD;&#xA;                times[i][j]=now&#xD;&#xA;                h.add((i,j))&#xD;&#xA;                for dx,dy in directions:&#xD;&#xA;                    x,y=i+dx,j+dy&#xD;&#xA;                    if 0&amp;lt;=x&amp;lt;m and 0&amp;lt;=y&amp;lt;n and grid[x][y]!=2 and (x,y) not in h:&#xD;&#xA;                        q.append((x,y)) &#xD;&#xA;            now+=1&#xD;&#xA;        #然后我们求人到各个节点用时&#xD;&#xA;        people=[[0x7fffffff]*n for _ in range(m)]&#xD;&#xA;        q.append((0,0))&#xD;&#xA;        h.clear()&#xD;&#xA;        now=0&#xD;&#xA;        h=set()  &#xD;&#xA;        while q:&#xD;&#xA;            length=len(q)&#xD;&#xA;            for _ in range(length):&#xD;&#xA;                i,j=q.popleft()&#xD;&#xA;                people[i][j]=now&#xD;&#xA;                h.add((i,j))&#xD;&#xA;                for dx,dy in directions:&#xD;&#xA;                    x,y=i+dx,j+dy&#xD;&#xA;                    if 0&amp;lt;=x&amp;lt;m and 0&amp;lt;=y&amp;lt;n and grid[x][y]!=2 and grid[x][y]!=1 and (x,y) not in h:&#xD;&#xA;                        q.append((x,y)) &#xD;&#xA;            now+=1&#xD;&#xA;        if times[-1][-1]&amp;lt;people[-1][-1] or people[-1][-1]==0x7fffffff:&#xD;&#xA;            return -1 &#xD;&#xA;        if times[0][0]==0:&#xD;&#xA;            return -1&#xD;&#xA;        if times[-1][-1]==0x7fffffff:&#xD;&#xA;            return 1000000000#火不可达,说明人到火这一路都没有火&#xD;&#xA;        maxNeed=times[-1][-1]-people[-1][-1]&#xD;&#xA;        if times[-1][-2]&amp;gt;people[-1][-2]+maxNeed or times[-2][-1]&amp;gt;people[-2][-1]+maxNeed:&#xD;&#xA;            return maxNeed&#xD;&#xA;        return maxNeed-1&#xD;&#xA;&lt;p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>[思考]关于知识的诅咒</title>
				<link>https://noirzh.com/think-curse-of-knowledge/</link>
				<pubDate>Fri, 30 Jun 2023 17:07:38 +0800</pubDate>
				<guid>https://noirzh.com/think-curse-of-knowledge/</guid>
				<description>&lt;h2&gt;前言&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;知识的诅咒,简单来说就是当一个人拥有了某个知识之后,就会不知道自己是如何掌握这个知识的,严重一些的就会出现无法理解没有该知识的人的相关想法。&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;场景&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;实际上这个事情的场景很多，我们以熟悉的编程为例：BFS，当我们提到某个编程使用BFS方法的时候，我们会忽略其如何实现，因为当你知道的时候，这个编程问题已经结束了，重点无非是一些实现细节，但是如果你希望将这个方法介绍给某个没有学习过BFS的人呢，你首先一定要介绍BFS，不然一切都是徒劳，当然可能有天赋异禀的人能够通过这些不带注释的代码迅速理解方法，不过这种人还是少数，知道运行逻辑和不知道运行逻辑的代码理解起来的差异可能也算一种。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;但是具体来说编程其实属于知识的诅咒比较少的，多数时候可能是了解太多算法然后遇到特定问题不知道如何取舍算一种。这个并不好理解，但是在这就解释到这里。&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;思考&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;在讨论的时候我们会经常遇到类似的情况，当涉及到某些概念的时候，我们最好确定交谈的双方都对这个概念有着较为一致的理解，不然容易出现问题。比如说一些对于解构的meme图的解构的meme，对于一个不理解的人呢，你要先介绍原meme，比如说是电车难题，在介绍解构，比如说是马桶搋子，再介绍对这个解构的解构，比如说拿着马桶搋子的人绑在铁轨上，这是一个复杂的过程，而这仅仅只是一张图片。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;所以在有些时候，当你只问某个东西是什么的时候，这个问题便已经无法回答了。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;但是当这个讨论变成教授的时候，一切都变了。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;知识的诅咒出现在教学里，这对很多人来说是深有体会的，你看写书的人迅速几笔带过，但是你自己就是无法理解。这是知识构筑的塔，当你看见某处漏了个洞的时候，你其实不知道这个洞有多深。可能从梯度下降算法开始解释最后细致到三角函数的性质上。当然，这就不是我希望讨论的了。当教的一方发现无法教会的时候，我们总有漫长的路来去找这个诅咒这次落在了哪。&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;拓展&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;当然，知识的诅咒也可以是被反向利用的，尽管大部分时候并不是那么有趣。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;我也一直在致力于消除自己的一些知识的诅咒，在尝试用一些更加寻常的东西来描述这个世界，和我想解释的问题。所以我摸索出来的就是一些方法：尽可能为每一个我在此次交流中提出的新概念做足够的解释，尽可能在声明之后调用，尽可能将自己无知化…当然，这都是后话了&lt;/p&gt;&#xD;&#xA;&lt;p&gt;以上就是全部内容&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
