美文网首页
八皇后问题

八皇后问题

作者: 一见有血 | 来源:发表于2018-03-21 18:12 被阅读0次

问题描述:

在8x8的网格上,放置皇后两个皇后,两个皇后之间不能在同一行,也不能在同一列,也不能在对角线上。

class Program

    {

        static int N = 8;

        static int[] index = new int[N];

        static int solution = 0;

        static void Main(string[] args)

        {

            for (int i = 0; i < N; i++)

                index[i] = 0;

            //Test8Huanghou();

            //Test8Huanghou2();

            //默认列索引0开始

            Test8Huanghou3(0);

            Console.ReadLine();

        }

        //参数为列的索引,从0开始

        private static void Test8Huanghou3(int col)

        {

            //选定一列后,循环这一列的每一行

            for( int i = 0;i < N;i++)

            {

                if( col == N)

                {

                    if( solution > 2)

                    {

                        return;

                    }

                    solution++;

                    Console.WriteLine("-solution:" + solution);

                    PrintMap();

                    return;

                }

                //假定将一个皇后放到col列的i行

                index[col] = i;//注意此处,数组的索引是列索引,数组索引对应值是这一列的第几行放置了皇后(同时注意索引从0开始)

                //检测当前放置的是否可以放

                if(CheckCanSet(col))

                {

                    //如果可以放置,则开始进行下一列的放置

                    Test8Huanghou3(col + 1);

                }

            }

        }

        //检测某个位置是否可放置

        private static bool CheckCanSet(int col)

        {

            //根据传递进来的列,我们从左往右进行检测,从0到(col-1)依次检测

            for( int i = 0;i < col;i++)

            {

                //如果是同一行,返回false

                if( index[i] == index[col])

                {

                    return false;

                }

                //是否存在斜线上的元素,返回false,这里用到了斜率

                if( Math.Abs(index[col] - index[i]) == Math.Abs(col - i))

                {

                    return false;

                }

            }

            return true;

        }

        private static void PrintMap()

        {

            for( int i = 0;i< N;i++)

            {

                //+1输出是为了看着清晰

                Console.Write("(" + (i+1) + "," + (index[i] + 1) + ")");

                Console.WriteLine("=====");

            }

        }

}

相关文章

  • 11.数据结构—八皇后问题(回溯法)

    11.1 八皇后问题 八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放...

  • 算法(03)回溯

    八皇后问题

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在...

  • 八皇后问题

    问题的类别是回溯(backtrace). 回溯通常用递归实现。回溯中注意边界问题,避免越界。同时,剪枝可以减少ca...

  • 八皇后问题

    课堂上老师讲了广度优先搜索算法后让课下实现下八皇后问题,就突发奇想了很多实现方法,这里只把我的实现方式和实现代码粘...

  • 八皇后问题

    问题 八皇后问题是一个古老而著名的问题,是试探法的典型例题。该问题由19世纪数学家高斯1850年手工解决。原题为在...

  • 八皇后问题

    采用试探回溯策略,通过栈记录查找结果,实现八皇后问题求解。 测试代码

  • 八皇后问题

    如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任两个皇后都不能处于同一条横行、纵行或斜线上。 先从第一列开...

  • 八皇后问题

    问题描述: 在8x8的网格上,放置皇后两个皇后,两个皇后之间不能在同一行,也不能在同一列,也不能在对角线上。 cl...

网友评论

      本文标题:八皇后问题

      本文链接:https://www.haomeiwen.com/subject/ccfnqftx.html