簡體   English   中英

Java方法,以對角線方式檢查2D數組中的對象

[英]Java Method that checks for objects diagonally in 2D array

我正在用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++];
                  }   
                }
               }
             }

我已經寫了一個八部分的八皇后/ N皇后問題系列。

這是問題的大致概述以及遞歸解決方案。

這是一個遺傳算法解決方案。

這是一個模擬的退火解決方案。

對於碰撞檢查本身,類似以下的方法非常有效:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM