如何比较以下两个对象?

时间:2019-04-03 10:20:59

标签: c++ data-structures set operators

我正在尝试使用DFS / BFS(因为这两个基本相同,所以我们专注于DFS)算法来解决9层拼图,并且在进行一些调试之后,我总结了为什么我的代码不起作用。 / p>

我正在使用一个用于边界的堆栈和一个用于封闭集的集来实现该算法,在某些时候,我必须检查封闭集中是否存在对象。因此,我自然使用(temp是一个9格的对象):

if (closed.find(temp) == closed.end()){ 
\\do stuff
}

当我尝试使用此表达式时,我了解到必须重载'<'和'>'运算符,以便set.find()可以工作。所以解决我的问题,9块对象基本上是2d 3x3整数数组, 空图块所在的值0。例如,如何确定董事会的以下状态之一是“大于”还是“小于”?

6 7 1   3 6 0
0 3 2   2 8 4
4 5 6   5 1 7

我尝试过将每个元素的最终状态进行比较:

1 2 3
4 5 6
7 8 0

为每个图块添加一个与最后一个图块相同的点,但是它不起作用,显然是因为两个完全放置不正确图块的木板的得分相同,所以我无法进行比较。

我还尝试过仔细研究两个板的元素,并编写如下分数:

bool operator < (const Board &A, const Board &B){
    int scoreA=0, scoreB=0;

    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            scoreA += i * j * A.getTile(i, j);
            scoreB += i * j * B.getTile(i, j);
        }
    }
    return scoreA < scoreB;
}

但是我不确定这是正确的,因为我没有得到想要的结果。

您能提出一种比较像这样的两个板的更好方法吗?

3 个答案:

答案 0 :(得分:0)

您可以尝试从板上制作一个整数,例如

1 2 3 4 5 6 = 123456780 7 8 0

或您想要的任何其他方式。

这样,您不必比较木板,只需比较整数表示形式即可。

答案 1 :(得分:0)

由于您比较的变量是分数,因此我假设您要进行比较以检查哪个板更接近于瓷砖移动问题的解决方案。

在这种情况下,您必须定义一些函数double calculateScore(const Board& board),然后进行比较:

double calculateScore(const Board& board)
{
  double score = 0.0;
  // as you wrote: adding one point for each tile that is the same as in the final 
  return score;
}

bool operator<(const Board& lhs, const Board& rhs)
{
  return calculateScore(lhs) < calculateScore(rhs);
}

然后您的目标是成为一个使该分数最大化的董事会。

答案 2 :(得分:0)

由于您使用的是BFS / DFS,所以哪个元素“更大”或“更少”无关紧要。您只需要顺序一致即可(如果a

对图块的字典比较就足够了。像这样:

bool operator < (const Board &A, const Board &B){

    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            int aTile = A.getTile(i,j);
            int bTile = B.getTile(i,j);
            if (aTile != bTile) {
                return (aTile<bTile);
            }
        }
    }
    return false; //equal
}

请注意,这可以很好地工作,但是使用unordered_set会更快。

此外,由于您将创建许多板,因此使用较小的表示形式将非常不错。如果按照其他海报建议将它们打包到int中,则可以将它们与标准<进行比较。如果将它们打包为字节数组,则可以使用memcmp