13,遞迴,八皇后問題
阿新 • • 發佈:2020-07-22
每擺放一個皇后,都檢查和之前所有皇后是否衝突,否則回溯
1,ArrayQueen[i] == ArrayQueen[n]皇后是否在同一列
2,Math.Abs(n - i) == Math.Abs(ArrayQueen[n] - ArrayQueen[i])皇后是否在同一斜線上
C#程式碼實現如下:
using System; namespace 資料結構 { public class Queen { //皇后數 const int queenMax = 8; //統計共有多少種擺法 static int count; //定義陣列存放皇后位置結果,如{0,4,7,5,2,6,1,3} int[] arrayQueen = new int[queenMax]; public static void Main(string[] args) { Queen queen = new Queen(); queen.Check(0); Console.WriteLine($"共有{count}種擺法"); } //列印皇后位置 private void Print() { count++; foreach (var q in arrayQueen) { Console.Write(q+" "); } Console.WriteLine(); } //n表示第幾個皇后 private void Check(int n) { if (n == queenMax) { Print(); return; } //每一行都擺8次 for (int j = 0; j < queenMax; j++) { //皇后擺放位置,回溯 arrayQueen[n] = j; //如果沒衝突擺放下個皇后 if (judge(n)) { Check(n + 1); } //如果衝突繼續擺放下一個皇后位置arrayQueen[n] = j++ } } //n表示第幾個皇后 private bool judge(int n) { for (int i = 0; i < n; i++) { //ArrayQueen[i] == ArrayQueen[n]皇后是否在同一列 //Math.Abs(n - i) == Math.Abs(ArrayQueen[n] - ArrayQueen[i])皇后是否在同一斜線上 if (arrayQueen[i] == arrayQueen[n] || Math.Abs(n - i) == Math.Abs(arrayQueen[n] - arrayQueen[i])) { return false; } } return true; } } }