C#八皇后算法:回溯法 vs 列优先法 vs 行优先法 vs 对角线优先法

目录

1.八皇后算法(Eight Queens Puzzle)

2.常见的八皇后算法解决方案

(1)列优先法(Column-First Method):

(2)行优先法(Row-First Method):

(3)对角线优先法(Diagonal-First Method):

(4)回溯法(Backtracking):


1.八皇后算法(Eight Queens Puzzle)

       皇后问题是一个古老而著名的问题,它实质上就是使棋盘上的8个皇后不能在同一行、同一列或同一条斜线上,共有92种方法。

2.常见的八皇后算法解决方案

        八皇后算法的解决方案有多种,以下是一些常见的解决方案:

(1)列优先法(Column-First Method):

        首先选择一个空的棋盘,然后从第一行开始,尝试将皇后放置在每一列。如果当前列没有被攻击,那么就将皇后放置在该列。否则,尝试下一列。当找到一个有效的列时,将皇后放置在该列的最下方。重复这个过程,直到所有的皇后都被放置在棋盘上。

(2)行优先法(Row-First Method):

        与列优先法类似,但不同之处在于,该方法从第一列开始,尝试将皇后放置在每一行。如果当前行没有被攻击,那么就将皇后放置在该行的最右侧。否则,尝试下一行。当找到一个有效的行时,将皇后放置在该行的当前列。重复这个过程,直到所有的皇后都被放置在棋盘上。

(3)对角线优先法(Diagonal-First Method):

        该方法首先选择一个空的棋盘,然后从左上角开始,尝试将皇后放置在对角线上。如果当前对角线没有被攻击,那么就将皇后放置在该对角线的最下方。否则,尝试下一个对角线。当找到一个有效的对角线时,将皇后放置在该对角线的当前列。重复这个过程,直到所有的皇后都被放置在棋盘上。

(4)回溯法(Backtracking):

        该方法通过递归的方式尝试所有可能的皇后位置。算法步骤如下:

  • 选择一个空的棋盘。
  • 选择一个皇后,将其放置在棋盘的第一行的任意一列。
  • 选择下一个皇后,将其放置在下一行的任意一列,但不能与第一个皇后位于同一列或同一对角线上。
  • 重复步骤3,直到所有的皇后都被放置在棋盘上。
// 八皇后算法_回溯法
namespace _144
{
    class Program
    {
        #region 八皇后算法
        /// <summary>
        /// 解决八皇后问题
        /// </summary>
        /// <param name="size">皇后数量</param>
        static void QueenArithmetic(int size)
        {
            int[] Queen = new int[size];//每行皇后的位置
            int y, x, i, j, d, t = 0;
            y = 0;
            Queen[0] = -1;
            while (true)
            {
                for (x = Queen[y] + 1; x < size; x++)
                {
                    for (i = 0; i < y; i++)
                    {
                        j = Queen[i];
                        d = y - i;
                        //检查新皇后是否能与以前的皇后相互攻击
                        if ((j == x) || (j == x - d) || (j == x + d))
                            break;
                    }
                    if (i >= y)
                        break;     //不攻击
                }
                if (x == size)     //没有合适的位置
                {
                    if (0 == y)
                    {
                        Console.WriteLine("Over");        //回溯到了第一行
                        break;     //结束
                    }
                    Queen[y] = -1; //回溯
                    y--;
                }
                else
                {
                    Queen[y] = x;   //确定皇后的位置
                    y++;            //下一个皇后
                    if (y < size)
                        Queen[y] = -1;
                    else
                    {
                        Console.WriteLine("\n" + ++t + ':');//所有的皇后都排完了,输出
                        for (i = 0; i < size; i++)
                        {
                            for (j = 0; j < size; j++)
                                Console.Write(Queen[i] == j ? 'Q' : '*');
                            Console.WriteLine();
                        }
                        y = size - 1;//回溯
                    }
                }
            }
            Console.ReadLine();
        }
        #endregion

        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);

            int size = 8;           //皇后数
            QueenArithmetic(size);
        }
    }
}

相关推荐

  1. VS的广告

    2024-03-14 01:50:04       9 阅读
  2. C#求最大公约数: 欧几里得算法 vs 辗转相除

    2024-03-14 01:50:04       20 阅读
  3. 算法--回溯

    2024-03-14 01:50:04       10 阅读
  4. em,rem,vw,vh,px,rpx,%的用

    2024-03-14 01:50:04       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-14 01:50:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-14 01:50:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-14 01:50:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-14 01:50:04       20 阅读

热门阅读

  1. Kafka及Zookeeper集群部署

    2024-03-14 01:50:04       22 阅读
  2. 软件测试面试题

    2024-03-14 01:50:04       26 阅读
  3. 可变参数&collections学习

    2024-03-14 01:50:04       20 阅读
  4. Linux Shell:local关键字

    2024-03-14 01:50:04       19 阅读
  5. 01-shell的自学课-基础变量学习

    2024-03-14 01:50:04       19 阅读
  6. HTML 参考手册- (HTML5 标准)

    2024-03-14 01:50:04       24 阅读
  7. Android UI 代码实现:可换行的布局控件

    2024-03-14 01:50:04       23 阅读
  8. Keil C51 汉字显示 BUG 解决方案

    2024-03-14 01:50:04       22 阅读
  9. 【npm】 npm link软链接的使用

    2024-03-14 01:50:04       19 阅读