C# 6皇后 非递归检查 规律总结

class Program
    {
        static void Main(string[] args)
        {
            int[,] chessboard = new int[6, 6]{
                  {0,0,0,0,0,0 },
                  {0,0,0,0,0,0 },
                  {0,0,0,0,0,0 },
                  {0,0,0,0,0,0 },
                  {0,0,0,0,0,0 },
                  {0,0,0,0,0,0 }
                };

            Random random = new Random();//创建一个随机数


            for (int i = 0; i < chessboard.GetLength(0); i++)
            {
                int temp = random.Next(0, 6);
                chessboard[i, temp] = 2;
            }//随机填充一下每行的皇后
            ShowChessboard(chessboard);//显示填充之后的棋盘

            bool isNeed = CheckChessboard(chessboard);//判断是不是满足6皇后
            Message(isNeed);//控制台显示是不是
           
            while (true)//死循环重复生存棋盘直到找到一个6皇后的解
            {
                isNeed= CheckChessboard(chessboard);
                if (isNeed == true) break;//满足规则结束循环
                ResetTheBoard(chessboard, random);//不满足继续重新生成
            }
            
           
            ShowChessboard(chessboard);//显示6皇后棋盘
            Message(isNeed);//控制台显示是不是

        }

        /// <summary>
        /// 根据规则 输出到控制台提示
        /// </summary>
        /// <param name="isNeed"></param>
        static void Message(bool isNeed) {
            if (isNeed)
            {
                Console.WriteLine("棋盘满足六皇后规则");
            }
            else
            {
                Console.WriteLine("棋盘不满足六皇后规则");
            }
        }

        /// <summary>
        /// 重置棋盘
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="random"></param>
        static void ResetTheBoard (int[,] arr,Random random)
        {
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    arr[i, j] = 0;
                }
            }
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                int temp = random.Next(0, 6);
                arr[i, temp] = 2;
            }
        }

        /// <summary>
        /// 检查棋盘是否符合皇后规则
        /// </summary>
        /// <param name="arr"></param>
        /// <returns></returns>
        static bool CheckChessboard(int[,] arr)
        {
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                int tempJ = GetLine(arr, i, arr.GetLength(1));
                for (int j = i + 1; j < arr.GetLength(0); j++)
                {
                    int tempJ1 = GetLine(arr, j, arr.GetLength(1));
                    if (tempJ == tempJ1)//2行的皇后在同一列
                    {
                        return false;
                    }
                    if (Math.Abs(i - j) == Math.Abs(tempJ-tempJ1))//2行的皇后在对角线
                    {
                        return false;
                    }
                }
            }
            return true;
        }

        /// <summary>
        /// 显示棋盘
        /// </summary>
        /// <param name="arr"></param>
        static void ShowChessboard(int[,] arr)
        {
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    Console.Write(arr[i, j] + ",");
                }
                Console.WriteLine();
            }
        }

        /// <summary>
        /// 传入行数返回这1行皇后在第几列
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="row"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        static int GetLine(int[,] arr, int row, int length)
        {
            for (int j = 0; j < length; j++)
            {
                if (arr[row, j] == 2)//这个位置有皇后
                {
                    return j;
                }
            }
            return -1;
        }
    }


版权声明:本文为liuyi89430原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。