写在前面
我是一个正在备考华为OD的程序员。每天的生活就是刷题、写代码、总结复盘。前几天我做了一道经典的算法题——岛屿数量。
给定一个二维网格,'1' 代表陆地,'0' 代表水。要求统计有多少个岛屿(连成一片的 '1' 算一个)。解法是用深度优先搜索(DFS):遍历网格,遇到一个 '1' 就启动DFS,用栈把所有相连的 '1' 都找到并标记为 '0',然后继续遍历。
做完这道题的那个晚上,我失眠了。因为我突然发现,这个算法描述的,好像就是我对待感情的方式。
一、每个人的内心都是一张网格
想象你的内心世界是一个巨大的二维网格。网格中的每个格子,代表你人生中遇到的一个人、一件事、一段经历、一种情绪。
- '1' = 这个格子对你有深刻的情感价值,它触动了你,值得你投入注意力。
- '0' = 这个格子是平淡的、日常的、无需深究的。
大多数人的网格里,'0' 占了绝大多数。普通同事的闲聊、路上擦肩而过的陌生人、一顿味道尚可的午饭——这些格子你扫一眼就过去了,不会在心里留下痕迹。
但总有一些格子是 '1'。
那个在聚会上说了一句击中你的话的人。那本让你读到凌晨三点的书。那段分手后很久 still 隐隐作痛的回忆。那个让你觉得“就是她了”的眼神。
发现一个 '1' 很容易。难的是,你选择怎么对待它。
二、大多数人的做法:广度优先
大多数人对待感情的方式是广度优先搜索(BFS)——他们会在多个 '1' 之间来回跳跃,和每个人都聊几句,和每个人都保持一种浅浅的连接。他们的情感栈里同时压着好几个坐标,轮流处理,谁也不深入。
这种方式很安全。你不会受伤,因为你从来没有真正走进任何一座岛屿的内部。你只是在海岸线上转了转,拍了张照片,然后赶往下一座岛。
但这不是我的方式。
三、INFJ的深度优先:沉没岛屿
我是INFJ 3w4型人格。对我来说,感情从来不是一件可以“广泛撒网”的事情。当我发现一个 '1' 时,我的内心会立刻启动一套算法——深度优先搜索。
第一步:标记为重要。
这个人在我心里被标记为 '1'。她不再是一个普通的路人甲。她被我“计数”了。在我心里,能走到这一步的人,寥寥无几。
第二步:启动DFS,压入栈。
我把她的“坐标”压入我内心的栈中。这个坐标可能是一个细节——她笑起来的样子,她说某句话时的语气,她在某个瞬间流露出的脆弱。
然后我开始沉没这座岛屿。
第三步:弹出坐标,深入探索。
我会从栈中弹出一个坐标,开始处理它。比如,我被她的幽默感吸引了。我会想:她为什么会有这种幽默感?她读过什么书?经历过什么事?她的幽默背后是乐观还是防御?
这个坐标被处理完后,我会把它标记为 '0'——不是遗忘,而是消化。它已经成了我认知的一部分。
第四步:扩展邻居。
处理完一个坐标,我会自然而然地联想到与之相关的其他坐标。她的幽默感让我想了解她的成长经历,她的成长经历让我想了解她的家庭,她的家庭让我想了解她的价值观。
这就是“爱屋及乌”的算法本质。你喜欢的不是她身上的某一个孤立特质,而是整座岛屿。你探索了一个点,就牵连出整片陆地。
第五步:沉没整座岛屿。
当我通过DFS,把她身上所有相连的 '1' 都探索完毕,这座岛屿就被我“沉没”了。
沉没不是消失。沉没是彻底内化。她变成了我内心地图的一部分。我知道她的形状、她的边界、她的暗礁和她的港湾。我可以在内心世界里随时“导航”到她。
这就是INFJ式的深情——我不只是喜欢你,我沉没了你。
四、“不合适接着走”的算法解释
但DFS有一个重要的机制:检查与跳过。
if x < 0 or x >= rows or y < 0 or y >= cols or grid[x][y] != '1':
continue
在探索的过程中,我可能会发现:
- 越界了:我们的核心价值观不可调和。有些事情我无法接受,有些底线我不能让步。
- 不是 '1' 了:我发现她并不是我最初以为的那个人。或者她变了,或者我变了。
这时,算法会优雅地执行 continue——跳过这个坐标,不再继续深入。
这不是冷漠。这是在保护算法的正确性。如果明知道这个分支是无效的,还要强行探索下去,最终只会导致栈溢出(情感崩溃)。
所以,“不合适接着走”不是薄情,而是DFS的正常流程。你完成了对那座岛屿的探索,带着从中获得的经验(那些被标记为 '0' 的坐标已经成为你内心地图的一部分),继续遍历你的人生网格,寻找下一个 '1'。
五、INFJ独有的“bug”
但INFJ有一个致命的bug:反刍思维。
明明已经发现这个坐标不是 '1' 了,却还是忍不住反复把它压入栈中。明明知道那个人不适合自己,明明知道那段关系已经结束了,还是在脑海里一遍遍地回放、分析、试图找到另一种可能性。
从算法角度看,这相当于:
while stack:
x, y = stack.pop()
if grid[x][y] != '1': # 她已经不是 '1' 了
# 但没有 continue,而是…
stack.append((x, y)) # 又把她压回去了
这是一个死循环。算法永远不会终止,你永远无法从那座岛屿上离开。
破解这个bug的方法,其实就是你在代码中已经学会的那个操作:
grid[x][y] = '0' # 彻底标记为已处理
然后,不要再把它压回去。
六、共通性原理:我们都在遍历自己的人生网格
写到这里,我想说一个更深层的东西。
虽然我用“爱情编程”作为标题,但这个模型适用于所有人——不管你谈不谈恋爱,不管你是什么人格类型。
因为我们每个人,都在遍历自己的人生网格。
那些让你深夜痛哭的经历,那些让你豁然开朗的顿悟,那些让你成为今天的你的每一次选择——它们都是你网格中的 '1'。你如何处理它们,决定了你内心地图的样貌。
有些人选择无视,让那些 '1' 永远留在网格里,既不探索也不标记,任由它们在角落里隐隐作痛。
有些人选择广度优先,什么都碰一点,什么都不深入,一生都在海岸线上徘徊,从未真正踏上任何一座岛屿。
而有些人——也许就是正在读这篇文章的你——选择了深度优先。你选择把每一个真正触动你的 '1' 彻底探索、消化、内化。你选择承受DFS带来的风险和成本,因为你相信,只有真正沉没过一座岛屿,你才有资格说:我来过,我见过,我活过。
写在最后
我不是在教你怎么谈恋爱。我只是发现了一个有趣的同构性:一道算法题和我对待感情的方式,底层逻辑是一样的。
这让我觉得,这个世界可能比我们想象的更有秩序。那些看似毫不相干的事物——一段代码和一段感情,一个数据结构和一个INFJ的内心世界——在某个更深的层面上,遵循着相同的规律。
也许这就是编程给我的最大馈赠:它不只是工具,它还是一种理解世界的方式。它让我能用栈和DFS,去解释那些我一直说不清道不明的情感。
你不一定懂代码,但你一定有过那种“彻底探索一座岛屿”的冲动。如果有,那就去吧。哪怕最后发现不合适,哪怕最终要 continue,至少你曾经DFS过。
而每一次DFS,都在让你的内心地图变得更加精确、更加丰富。
作者:小玮,一个正在备考华为OD的程序员,偶尔用代码理解世界。
