斜めにn個の女王をチェックJAVA

fetucinni:

私は私がオンラインだのコードを理解することについての問題を抱えています。他の女王との衝突があります場合は女王のチェックです。誰かがこのDOを何私に説明できますか?第一の条件は、私はそれは同じ行のチェックだ知っていたが、何の絶対数は?

if ((board[i] == board[row]) || Math.abs(board[row] - board[i]) == (row - i)) 
{
     return false;
}

ここでは、完全なコードは次のとおりです。

class NQueen {

private int[] board;
private int size;
private ArrayList allSolutions = null;

public int[] getBoard() {
    return board;
}
public ArrayList getAllSolutions() {
    return this.allSolutions;
}
public NQueen(int size) {
    this.size = size;
    board = new int[this.size];
    this.allSolutions = new ArrayList();
}
public void place(int row) {
            // base case
    if (row == size) {
        int[] temp = new int[size];
                    // copy in temp array
        System.arraycopy(board, 0, temp, 0, size);
                    // add to the list of solution
        allSolutions.add(new Solution(temp));
        return ;
    } else {
        for (int i = 0; i < size; i++) {

            board[row] = i;
                            /* when you place a new queen
                             * check if the row you add it in, isn't 
                             * already in the array. since the value of arrray is
                             * the row, so we only need to check the diagonals no need to check for collisions on the left or right. 
                             * As long as there is no duplicate values in the array.*/
            if (valid(row)){
                               place(row + 1);
                            }

        }
    }
}
public boolean valid(int row) {
    for (int i = 0; i < row; i++) {
                    // if same row  or same diagonal
        if ((board[i] == board[row]) || Math.abs(board[row] - board[i]) == (row - i)) 
                    {
                        return false;
        }
    }
    return true;
}

}

Knittl:

あなたは、アレイ内の2次元アレイと基板「セル」の各位置を持っている場合は、同じ対角になるように、片が同一の水平及び垂直距離を持たなければなりません。

Math.abs(board[row] - board[i]) == (row - i)

チェックしまさにそれ。Math.abs第二部分は左上、右上、右下、及び左下することができるからです。必ずどのように正確にあなたのアルゴリズムが実装されているが、それはあまりにも第二オペランドの絶対値を取るために、おそらく良いアイデアではありません。

小さなボードでの例:

  1 2 3 4
1
2 x
3
4     y

そこでここでは、2(ABS(1-3))の水平距離を持っており、2(ABS(2-4))のも、垂直距離

例2:

  1 2 3 4
1       x
2     y
3 
4 

ここでは、唯一の1(ABS(4-3)とABS(1-2))の唯一の水平方向と垂直方向の距離を持っています

ファローアップ

各要素でのアレイの記憶この行の女王の位置。それだけで一次元配列されるように(寸法は、当初私が示唆されていない2)。

だから私の最初の例のために、あなたの配列が含まれています:

[ 0, 1, 0, 3 ]

(私はOPからのコードが0ベースの位置を想定しているが、配列要素を初期化すると思います0new int[size])。これはバグかもしれません 0が有効な位置で、他の制約と競合する可能性があるため、すなわちあなたの場所aにできなくなりますインデックス1にクイーン前または次の行から女王が初期化されていない場合(=位置0))。

例に戻る(バグを回避するために、明確にするために1ベースのインデックスを使用して、上述しました): (a[2] - a[4] == 1 - 3a[2] == 1a[4] == 3

「y」の作品ではなく、2列に移動された場合、あなたはなるだろうa[2] - a[4] != 1 - 3、彼らは対角線を共有していないので、( 、a[2] == 1a[4] == 3

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=18845&siteId=1