【问题标题】:Java Method that checks for objects diagonally in 2D array检查二维数组中对角线对象的Java方法
【发布时间】:2023-03-28 17:39:01
【问题描述】:

我正在用 Java 做一个 N Queens 程序。我能够打印每个皇后位于不同行和列的所有解决方案。现在我需要跟踪碰撞的对角线。所以二维数组上有 2n-1 条对角线。该算法希望我们在棋盘上有 2n-1 条负对角线和 2n-1 条正对角线。有一个大小为 2n-1 的数组,称为 d1,它跟踪 2n-1 条负对角线上的每一条上的皇后数,即碰撞次数。如果第 m 条负对角线上有 k 个皇后,则这条对角线上有 k-1 个碰撞。这 数字 k 被写入 d1 数组的第 m 个元素。同样,我们为 2n-1 条正对角线选择另一个大小为 2n-1 的数组,称为 d2。

这是我的 D2 方法,但我完全迷失了。我知道所有向上的对角线都是 row + col,但就是这样。

      public void D2(){
          int[] upDiag = new int[2*board.length - 1];
          int numberOfCollisions = 0;
             for(int row = 0; row < board.length; row++){
                 for(int col = 0; col < board.length; col++){
                    if(isQueen(row, col)){
                    upDiag[numberOfCollisions++];
                  }   
                }
               }
             }

【问题讨论】:

    标签: java multidimensional-array n-queens


    【解决方案1】:

    我写了一个关于八皇后/N皇后问题的三部分系列。

    Here's 问题的大致轮廓,以及递归解决方案。

    Here's 遗传算法解决方案。

    Here's 模拟退火解决方案。

    对于碰撞检查本身,这样的事情非常有效:

    double assessFitness(Integer[] candidate) {
        int collisions = 0;
        final int MAXIMUM_COLLISIONS = calculateMaxCollisions();
        for (int i = 0; i < GRID_SIZE - 1; i++) {
            for (int j = i + 1; j < GRID_SIZE; j++) {
                if ((candidate[i].equals(candidate[j])) || j - i == Math.abs(candidate[i] - candidate[j]))
                    collisions++;
            }
        }
        return (MAXIMUM_COLLISIONS - collisions) / (double) MAXIMUM_COLLISIONS;
    }
    

    请注意,这是改编自我的遗传算法解决方案。我确实解释了为什么我在博客文章中返回一个从 0 到 1 的值,但在您的情况下,稍作修改就会产生您正在寻找的结果:

    int countCollisions(Integer[] candidate) {
        int collisions = 0;
        final int MAXIMUM_COLLISIONS = calculateMaxCollisions();
        for (int i = 0; i < GRID_SIZE - 1; i++) {
            for (int j = i + 1; j < GRID_SIZE; j++) {
                if ((candidate[i].equals(candidate[j])) || j - i == Math.abs(candidate[i] - candidate[j]))
                    collisions++;
            }
        }
        return collisions;
    }
    

    为了使其工作,您确实需要计算 N-Queens 问题的最大允许碰撞次数。

    private int calculateMaxCollisions() {
        int sum = 0;
        for (int i = GRID_SIZE - 1; i > 0; i--) {
            sum += i;
        }
        return sum;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2020-03-19
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      相关资源
      最近更新 更多