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

posted @ 2020-07-22 12:00  小橘·Huang  阅读(148)  评论(0编辑  收藏  举报