天天看點

深度優先搜尋判斷對角線是否有元素的問題

在深度優先搜尋的例題中,比如像n皇後問題,三階魔方這些都涉及到了判斷對角線是否有元素的問題,其中主要是發現其中的填入的元素與其他有元素的位置上的坐标的關系

比如n皇後問題

(0, 1) (0, 1) (0, 2) (0, 3)
(1, 0) (1, 1) (1, 2) (1, 3)
(2, 0) (2, 1) (2, 2) (2, 3)
(3, 0) (3, 1) (3, 2) (3, 3)
           

上面為元素的具體坐标,假如将要填入的位置是(2,1),那麼那麼主對角線的元素為(1,0)(2,1)(3,2);附對角線的元素為(0,3)(1,2)(2,1) (3,0);

目前(2,1)坐标為(x,y),對角線上元素的坐标為(i, j)那麼可以發現:

主對角線與目前要填入的位置上的數字的行與列的規律為

y - x = j - i

附對角線與目前要填入的位置上的數字的行與列的規律為

y + x = j + i

這樣我們便可以在循環中周遊的時候利用上面的行與列的關系就可以知道對角線上是否有元素了

 private static boolean check(int row, int col){
        for(int i = 0; i < row; i++){
            if(rec[i] - i == col - row || rec[i] + i == col + row || rec[i] == col){
                return false;
            }
        }
        return true;
 }