八皇后问题

问题描述:

在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("=====");

            }

        }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,728评论 0 89
  • 八皇后问题问题描述:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔...
    药药耀耀阅读 2,104评论 0 0
  • 八皇后问题:在8*8的棋盘上放置8个皇后,保证任意两个皇后之间不能相互攻击。(即没有两个皇后是在同一行、同一类、或...
    五秋木阅读 773评论 0 0
  • include<cstdio> include<stdio.h> int queenPlaces[92][8];i...
    LuckTime阅读 224评论 0 0
  • 终于拿起笔了,坚持。 感觉远看还是可以看下去的
    忘忧smile阅读 215评论 0 0