2017-07-18 79 views
-1

我正在解決8 queen問題,並試圖通過互聯網查看比較解決方案,以瞭解我的解決方案與其他解決方案的比較。我發現一個非常小的暴力解決方案讓我感到困惑。我想知道是否有人關心解釋對角線比較實際上是如何工作的?瞭解8皇后拼圖的對角線搜索

void solve(int n, int col, int *hist) 
{ 
    int i; 
    int j; 

    if (col == n) 
    { 
     print_solution(n, hist); 
    } 
    i = 0; 
    while (i < n) 
    { 
     j = 0; 
     while (j < col && !(hist[j] == i || abs(hist[j] - i) == col - j)) 
      j++; 
     if (j < col) 
     { 
      i++; 
      continue; 
     } 
     hist[col] = i; 
     solve(n, col + 1, hist); 
     i++; 
    } 
} 

void main(void) 
{ 
    int hist[8]; 

    solve(8, 0, hist); 
} 

特別I have問題可視化的代碼是:

abs(hist[j] - i) == col - j) 

從我明白了什麼叫檢查對角線,但我沒有看到它。

+2

用筆和紙手工穿過它。 (這是我必須做的,以解釋給你,所以你也可以這樣做。) –

+0

@meowgoesthedog它通過主傳遞。 int hist [8]例如一個歷史緩衝區。 –

+0

@PaulOgilvie我試過了,數字對我沒有意義。 –

回答

0

由於第一個循環條件是j < col,此條件的右邊是正數。 i對應於正在檢查的當前行,並且hist[j]是第j列的女王行。因此,通過檢查水平和垂直距離是否相等,這將檢查兩點(hist[j], j)(i, col)位於「正斜槓」(/)或「反斜槓」(\),對角線上。 abs允許一次檢查兩個案例。