我一直在研究一个计算机科学问题,这个问题在第一次面试后非常成功地进行了第二次面试代码测试。否则,我会认为这是一个扣篮。
基本上,我是在2小时内使用格子细胞来实施扫雷。
如果它是1X1,则有一个单元格。
然后,如果它是2X2,一个细胞有四个细胞(儿童?),每个细胞都与父母双重链接。此外,这2个孩子彼此双重联系。另外两个孩子也是如此。
从子单元格遍历到另一个子单元格意味着必须只是跳转到下一个chid链接(兄弟),或者首先遍历到父级,然后到另一个子级链接对集合中的目标子级别。 (注意:树的想法只是我的想法,而不是要求)
我的一般想法是建立一个模式创建机制,然后根据深度参数隐式地变得越来越大。一种树状结构似乎是最好的方法。
这似乎很容易。但我无法理解模式创建逻辑:
具有多个子节点的树结构很容易(八叉树,四叉树,二叉树等),但是提出了一个优雅的系统,每当父节点生成多个子节点时,子节点也隐式链接到只有特定的兄弟姐妹对我来说是一个令人头疼的事。所以,基本上,根据我的想法,根是格子图的中心,最远的子节点在边缘。
此外,格子细胞可能有很多方面我不明白。我在互联网上挖掘,试图找到一个基础解释,说明为什么或如何有用。我在这个主题上找到了一个关于逻辑基础的入门:部分有序集,幂集,反身性和基于这些原理的点阵图,如Hasse图。
但是,对我来说这仍然不够好:没有C ++甚至是伪代码示例。
我理解哈希表,链表,反向链表(递归/迭代),二叉树(平衡/不平衡),向量,字符串,反转等(所有基本的基础知识)。 Trig,线性代数,四元数。一些计算。以及大量的图形编程技巧/技巧。我甚至从头开始编写了两个游戏引擎,但简单的格子问题让我感到震惊。我很尴尬。我想尽可能多地学习格子,所以我再也不会像那样被烧掉了。但是,我需要的文档很难找到。
我正在寻找一个关于格子主题的好的入门/教程(因为它与编写C ++算法有关) - 希望有一个能帮助我的人(从初学者开始,向前)就像典型的Sam在21天内自学C ++一样。由于格子似乎是非常先进的主题的中间,这可能是不可能的。
如果不是教程,如果你们中的任何一个人能够给我关于这个主题的知识,我将非常感激。
感谢。
答案 0 :(得分:1)
混淆起因于对格子这个词的误导性使用:在数学中,格子是一个poset,其中每两个元素都有一个lub(最小上界)和一个glb(最大下界)。游戏'树'(节点是棋盘的状态,由于树的独特路径属性,移动显然没有任何glb的边缘),即使你加入通过不同移动顺序到达的相同状态(在这种情况下)如果从给定的状态,你可以达到两个不同的最终状态,那么树就会变成有向图。十年来我没有玩过扫雷,但我的印象是有可能以这种方式结束游戏。因此,您需要考虑的基础数据结构是一个有向(可能是非循环)的图形,有时是数学意义上的一个点阵(忽略边缘上的方向),但并非总是如此。