zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
    

  • 相关阅读:
    [HAOI2007][SDOI2005]反素数
    [UVa1636]Headshot
    [Codeforces 581D]Three Logos
    [NOIP2014普及组]子矩阵
    洛谷 P3299 [SDOI2013]保护出题人 解题报告
    洛谷 P3965 [TJOI2013]循环格 解题报告
    洛谷 P3989 [SHOI2013]阶乘字符串 解题报告
    [SHOI2013]发牌 解题报告
    洛谷 P3962 [TJOI2013]数字根 解题报告
    LOJ 2664. 「NOI2013」向量内积 解题报告
  • 原文地址:https://www.cnblogs.com/xiaojvhuang/p/13359877.html
Copyright © 2011-2022 走看看