Go語言實現N皇后問題


N皇后問題是一個智力遊戲,需要將N個皇后放置在一個N×N的棋盤上,使得任何兩個皇后都不能處於同一行、同一列或同一對角線上(互相攻擊)。國際象棋中的皇后可以沿任何方向移動(水平、垂直和對角線),因此找到沒有兩個皇后能夠互相攻擊的位置是一項挑戰。在本文中,我們將編寫一個Go語言程式來實現N皇后問題。

語法

func make ([] type, size, capacity)

Go語言中的`make`函式用於建立陣列/對映,它接受要建立的變數的型別、大小和容量作為引數。

func append(slice, element_1, element_2…, element_N) []T

`append`函式用於向陣列切片新增值。它接受多個引數。第一個引數是要新增值的陣列,後面跟著要新增的值。然後,該函式返回包含所有值的最終陣列切片。

演算法

  • 步驟1 - 建立一個名為`is_safe`的函式,用於檢查在棋盤上的給定位置放置皇后是否安全。

  • 步驟2 - 此函式還檢查同一列、左上方對角線和右上方對角線上是否存在任何皇后。

  • 步驟3 - 建立一個名為`solveN_queens`的函式,該函式接受棋盤的當前狀態、當前行、棋盤大小N和指向輸出的指標。在此步驟中,檢查`row==N`是否為真,如果是,則將解決方案新增到輸出列表中。

  • 步驟4 - 迭代當前行中的所有列,並檢查在當前位置放置皇后是否安全。如果前一個條件滿足,則繼續執行後續步驟。

  • 步驟5 - 將當前位置設定為皇后佔據(`board[row][col] = true`)。

  • 步驟6 - 遞迴呼叫`solveN_queens`以處理下一行(`row+1`)。遞迴呼叫後,透過將當前位置設定為未佔用進行回溯。迴圈結束後,`solveN_queens`函式返回。

  • 步驟7 - 在主函式中,建立一個布林值的二維切片作為棋盤,並使用棋盤、行、輸出陣列和大小作為引數呼叫`solveN_queens`。

  • 步驟8 - 最後,迭代輸出列表,並使用`fmt`包中的`Println`函式在控制檯上列印輸出。

示例

在這個例子中,我們將編寫一個Go語言程式,使用回溯演算法在一個N×N棋盤上實現N皇后問題,並遞迴地將每個皇后放置在棋盤上。

package main

import "fmt"

func is_safe(board [][]bool, row, col, N int) bool {

   for i := 0; i < row; i++ {
      if board[i][col] {
         return false
      }
   }

   for i, j := row-1, col-1; i >= 0 && j >= 0; i, j = i-1, j-1 {
      if board[i][j] {
         return false
      }
   }

   for i, j := row-1, col+1; i >= 0 && j < N; i, j = i-1, j+1 {
      if board[i][j] {
         return false
      }
   }

   return true
}

func solveN_queens(board [][]bool, row, N int, outputs *[][]int) {
   if row == N {

      var output []int
      for i := 0; i < N; i++ {
         for j := 0; j < N; j++ {
            if board[i][j] {
               output = append(output, j+1)
               break
            }
         }
      }
      *outputs = append(*outputs, output)
      return
   }

   for col := 0; col < N; col++ {
      if is_safe(board, row, col, N) {

         board[row][col] = true

         solveN_queens(board, row+1, N, outputs)

         board[row][col] = false
      }
   }
}

func main() {
   n := 5
   board := make([][]bool, n)
   for i := 0; i < n; i++ {
      board[i] = make([]bool, n)
   }

   var outputs [][]int
   solveN_queens(board, 0, n, &outputs)

   for _, output := range outputs {
      fmt.Println(output)
   }
}

輸出

[1 3 5 2 4]
[1 4 2 5 3] 
[2 4 1 3 5]
[2 5 3 1 4]
[3 1 4 2 5]
[3 5 2 4 1] 
[4 1 3 5 2] 
[4 2 5 3 1] 
[5 2 4 1 3] 
[5 3 1 4 2]

輸出觀察

在第一個解決方案中,皇后排列在第一行的第一列,第二行的第三列,第三行的第五列,第四行的第二列,第五行的第四列。N皇后問題可能有多個解決方案,上述程式碼將找到所有有效的解決方案。

結論

在本文中,我們討論瞭如何實現N皇后問題。我們已經執行了一個使用回溯法的N皇后問題實現程式,在這個例子中我們使用了回溯法。實現N皇后問題可以幫助你提高解決問題和演算法設計的能力。

更新於:2023年7月5日

342 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.