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

C++ 基于相邻对象相似性的二维数组排序算法,c++,algorithm,sorting,C++,Algorithm,Sorting,我正在写一个程序 对多个方形瓷砖进行排序(其中 每一面都有五种颜色:红色、橙色、, 蓝色、绿色和黄色),它们彼此相邻 (如8行12列)以一种方式 尽可能使用相同的颜色连接。 比如说,右边有颜色的瓷砖 红色应该在右边有一个瓷砖,左边有一个红色。) 通过计算不匹配对的数量来评估结果 棋盘上有许多边。我已经基本完成了实际的程序; 我的排序算法有点问题。现在我正在使用 基于冒泡排序的算法,用于比较电路板上的每个部件 每隔一块,如果切换这两块会减少 电路板上不匹配的对边,它会切换它们。这里有一个 排序函数

我正在写一个程序 对多个方形瓷砖进行排序(其中 每一面都有五种颜色:红色、橙色、, 蓝色、绿色和黄色),它们彼此相邻 (如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]);
    }
for(int i=0;i
作为说明:Board是一个指向工件对象数组的指针。每件作品都有 指向四个相邻块的四块指针(如果该块为空,则为空) 一个侧边/角块。)而切换实际上并不切换块本身,而是 而是改变颜色。(它不是交换碎片,而是刮去颜色 这两种类型的开关。)

此算法的效果并不太差,它显著提高了 董事会,但它没有优化它,因为它应该。我想这是因为有一个侧面和一个角落 工件不能移动超过三个/两个错误的相邻工件,因为一个/两个侧面 这些都是空的。我试图对此进行补偿(将Board[I].GetMatchingPieces()相乘) 与Board[i].gethowmannonemptysides()进行比较),但这一点都没有帮助。 这就是我需要帮助的地方。我不知道很多排序算法,更不用说了 那些使用二维数组的。你们有人知道吗 一个可能帮助我改进工作的算法概念?或者有人能看到
我还没有发现的问题?感谢您的帮助。谢谢。

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

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


找到更好配置的一种方法是洗牌,搜索新的局部最小值,或者使用skeleten算法,允许您在状态中进行更大的跳跃,例如:。

Hi Dave!欢迎来到堆栈溢出!我不确定我会称之为排序问题。实际上,您并不是在根据成对比较函数按顺序排列各个部分。(换句话说,两个开关是否切换两个部件并不取决于部件本身,而是取决于每个部件周围的内容。)这更像是一个状态空间搜索,其中每个状态都是一个电路板配置(部件的排列),您通过考虑成对的部件开关来寻找最佳配置。看看alpha-beta和其他启发式搜索算法。我认为您可能只需要一个三角形循环:
for(I=0;I
。我认为您走的方向完全错误。我不认为“分类”是正确的方法。应该有一个简单的算法来第一次把它们放在正确的位置。等等,你是“画”这些碎片,还是它们是预先画好的。此外,如果它们是预涂的,它们可以旋转吗?