1. 程式人生 > 實用技巧 >13,遞迴,八皇后問題

13,遞迴,八皇后問題

每擺放一個皇后,都檢查和之前所有皇后是否衝突,否則回溯

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;
        }
    }
}