我在思考这个问题,因为两天,没有找到一个可行的解决:查找二维数组连接不同的元素
我有一个二维数组,并希望寻找项目的最大数量连接(水平和垂直,而不是对角线),但该组的任何项目都不应重复。用于可能的基团
实例:
--FG- or -F--- or -----
--E-- -E--- ---AF
-BC-- CBD-- ----B
-AD-- -A--- --CDE
这是我的问题的简化视图,因为在“现实”的阵列是6X9和有三种不同类型的“元素”的(可以说数字,字母和符号)与每个30个不同的可能项目和一个空白( - )元素。在第一遍中,我检查每个位置并查找相同元素的所有连接项目。这是比较容易实现与一个递归函数,场0,0是在左下方(另一简化视图):
12AB-1- The check for -AB----
23CD23- position 2:0 -CD----
2*CE55- ("C") would --CE---
#2E2*AA result in --E----
#$A23BC this: --A----
$$F1+*E --F----
21C31*2 --C----
用于位置2所述的检查:0“C”将导致与阵列10个连接的“字母”项目。现在我搜索这个新数组中最大数量的连接项目,这些连接项目是不同的,因此在新组中不是两个重复的项目。对于位置2:0,这会导致最多连接4个不同的项目,因为如果不触及已经在组中的项目(这里是另一个C),则无法触及另一个项目。
对于我的问题,它足以检测最大。 10个项目组中的6个不同的连接项目。
对于上面的例子中的可能基团是(当我检查位置2:1“F”):
--B----
--D----
--C----
--E----
--A----
--F----
-------
我没有找到一种算法,那样做,如简单的递归函数我用它来查找数组中相同元素的所有项目。它似乎要复杂得多。
例如,该算法还必须认识到,它不会将位置3:4处的E添加到组中,而是将位置2:3处的E添加到组中。
我认为上述中间步骤,首先找到全部连接项目的要素是不必要的,但此刻我这样做在这里和我的代码,以使事情更加清楚:)
这适用于大多数情况,但如果有一些相同的项目,它并不总是找到所有不同的项目。我认为这与它看待邻居的顺序有关。我认为我必须用每一个可能的检查邻居的顺序来检查每个位置。如果检查失败,其他方法将返回到以前的位置。但所有这些都会以许多递归调用结束。对于我的特殊情况,我找到了另一个决议 – user1043409 2013-02-22 11:54:39