给定一个二维数组,其单元格被标记并组合在一起形成不同的线性形状,您将如何识别重复的形状。
0010000100000000000000000000
0010000100000000000000000000
0011100100000100000000011100
0000000100000111111000000000
0010000111100100000000000000
0110000000000001111000000000
0010000100000000000000000111
0000000001000000000011110000
0000000001111110000000000000
0010000001000000000000000000
这里我们有 3 个重复的形状:
1
111111
1
111
1
到目前为止我的想法是:
为了存储形状,我将为每个形状制作树,节点结构将是
typedef struct node{
struct node * leftchild;
struct node * rightchild;
struct node * downchild;
};
- 我将逐个单元格地遍历矩阵单元格,同时维护一个visited[][] 数组。
- 当我找到一个未访问的“1”时,我将为该单元创建一个新节点并将该节点标记为该形状的根节点,因为这将是该形状要访问的第一个节点。
- 然后我将检查在步骤 2 中找到的根单元格的左、右和下单元格,并(如果 1)将它们添加到相应的根节点的子节点。并用这些左右和向下的单元格重复它以完成该形状的树。
在第 2 步中,我还将根元素存储在一个数组中。
现在我有每个形状的根元素。我将不得不比较数组中存在的根节点表示的每一棵树,以找出任何重复的形状。
这个解决方案会起作用吗?此外,我觉得复杂性会很大。