[英]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.