基于相邻对象相似度的二维数组排序算法

时间:2011-11-04 18:58:23

标签: c++ algorithm sorting

我正在编写一个假设的程序 排序一些方形瓷砖(其中 每一面都用五种颜色中的一种着色 - 红色,橙色, 蓝色,绿色和黄色),彼此相邻 (例如,8行和12列),其方式与多边相同 相同的颜色连接尽可能。 因此,例如,右侧有色的瓷砖 红色应该在右侧有一个红色左侧的瓷砖。)

通过计算有多少非匹配对来评估结果 董事会中存在双方。我已经完成了实际的程序; 我的排序算法有些麻烦。现在我正在使用 基于冒泡排序的算法,比较电路板上的每个部分 与其他每一件,如果切换那两件减少了 电路板上不匹配的一对侧面,它们会切换它们。这里一个 排序函数的抽象版本,现在是:

for(int i = 0 ; i < DimensionOfBoard.cx * DimensionOfBoard.cy ; i++)
    for(int j = 0 ; j < DimensionOfBoard.cx * DiemsionOfBoard.cy ; j++)
    {
        // Comparing a piece with itself is useless
        if(i == j)
            continue;

        // v1 is the amount of the nonmatching sides of both pieces
        // (max is 8, since we have 2 pieces with 4 sides each (duh))
        int v1 = Board[i].GetNonmatchingSides() + Board[j].GetNonmatchingSides();

        // Switching the pieces, if this decreases the value of the board 
        // (increases the amount of nonmatching sides) we'll switch back)
        SwitchPieces(Board[i], Board[j]);

        // If switching worsened the situation ...
        if(v1 < Board[i].GetNonmathcingSides() + Board[j].GetNonmatchingSides())
            // ... we switch back to the initial state
            SwitchPieces(Board[i], Board[j]);
    }

作为解释:Board是指向Piece Object数组的指针。每件都有 四个指向四个相邻部分的指针(如果是一个部分,则为NULL) 一个侧面/角落。)并且切换实际上不会切换部件本身,但是 而是改变颜色。 (而不是交换碎片,它刮掉了颜色 两者和开关。)

这个算法不能太糟糕,它显着提高了它的价值 董事会,但它没有像它应该优化它。我认为这是因为侧面和角落 由于一个/两个侧面,因此不能移动三个/两个错误的相邻部件 是空的。我试图弥补这一点(通过乘以Board [i] .GetMatchingPieces() 与Board [i] .GetHowManyNonemptySides()之前的比较),但这没有帮助。 这就是我需要帮助的地方。我不知道很多排序算法,更不用说了 那些使用二维数组的人。所以你们中的任何人都可以知道 一个可以帮助我改进工作的算法概念?或者任何人都可以看到 我还没找到的问题?任何帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

如果有一个开关,你必须重新评估一个电路板,因为现在可能有以前的位置可以找到一个增强功能。

请注意,您将仅查找具有这些交换的局部最小值。您可能无法找到任何增强功能,但这并不意味着这是最好的电路板配置。

找到更好配置的一种方法是随机播放一个电路板并搜索一个新的本地最小值,或者使用一个允许你在该状态下进行更大跳跃的算法 - skeleten,例如:Simulated annealing