Recursion 用于识别N-Queen解决方案的校验和

Recursion 用于识别N-Queen解决方案的校验和,recursion,dictionary,checksum,backtracking,Recursion,Dictionary,Checksum,Backtracking,我已经通过使用回溯算法解决了N-Queen问题,并且可以在C#中生成所有唯一和不同的解决方案。虽然我已经通过在每一行中找到有效位置来限制递归的级别,但是当N>15时,该算法的速度将非常慢。我怀疑原因是每一个新的解决方案,我必须生成所有8个对称的副本,并检查这与已经找到的解决方案。如果这些都未包含,则可以将新的解决方案添加到唯一的解决方案中 我在某个地方看到了一个关于为每个解决方案附加校验和的提示,并创建了一个字典,其中校验和是关键,解决方案是一个列表。我找不到这篇文章,否则对校验和的概念来说是非

我已经通过使用回溯算法解决了N-Queen问题,并且可以在C#中生成所有唯一和不同的解决方案。虽然我已经通过在每一行中找到有效位置来限制递归的级别,但是当N>15时,该算法的速度将非常慢。我怀疑原因是每一个新的解决方案,我必须生成所有8个对称的副本,并检查这与已经找到的解决方案。如果这些都未包含,则可以将新的解决方案添加到唯一的解决方案中

我在某个地方看到了一个关于为每个解决方案附加校验和的提示,并创建了一个字典,其中校验和是关键,解决方案是一个列表。我找不到这篇文章,否则对校验和的概念来说是非常新的


在此问题上的任何帮助都将不胜感激。

为N皇后生成哈希或校验和?有几点:

  • 皇后是对等的。这意味着我们不想连续乘以校验和的皇后项来区分它们,因为它们应该是等价的

  • 位置才是最重要的

  • 因此,我们可以从以下内容开始:

    public int hashSolution (Queen[] queens) {
        int h = 0;
        for (Queen q : queens) {
            int queenHash = (q.getX() * 23) + q.getY();     // 23 is a prime.
            h += queenHash;
        }
        return h;
    }