八皇后问题

2018-03-21  本文已影响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("=====");

            }

        }

}

上一篇 下一篇

猜你喜欢

热点阅读