使用C#求解N皇后问题。

来源:互联网 发布:手机淘宝抢购怎么刷新 编辑:程序博客网 时间:2024/05/18 06:00

下面这个算法实现了列出所有可能放置的情况。

using System;

 

namespace Queen

{

        public class NQueen

        {

                private int m_N;   // m_N维的皇后放置问题。

                private int [,] m_Houses;  // 放置皇后矩阵。

                private int resultNum = 0; // 结果数量

 

                 // 初始化矩阵,0为没有被放置,1为有皇后存在的位置。

                public NQueen(int n)

                {

                        m_N = n;

            m_Houses = new int[m_N,m_N];

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

                                for(int j=0;j<m_N;j++)

                                        m_Houses[i,j] = 0;

                }

                 // 显示当前矩阵情况。

                public void Display()

                {

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

                        {

                                for(int j=0;j<m_N;j++)

                                {

                                        Console.Write(m_Houses[i,j].ToString() + " ");

                                }

                                Console.WriteLine();

                        }

                }

                

                 // 判断当前位置是否可以放置皇后。

                private bool isCurrentCanPlaced(int row,int col )

                {

                        int i,j;

                        for( i=0;i< row ;i++)

                        {

                                if(m_Houses[i,col] != 0)

                                        return false;

                        }

 

                        for(i = row-1,j=col -1; i>=0 && j>=0 ;i--,j--)

                        {

                                if(m_Houses[i,j] != 0)

                                        return false;

                        }

                        for(i = row-1,j=col +1; i>=0 && j<m_N ;i--,j++)

                        {

                                if(m_Houses[i,j] != 0)

                                        return false;

                        }

                        return true;

                }

                

                 // 将当前行的所有位置都置为可以放置

                private void ResetRow(int row)

                {

                        for(int j=0; j<m_N;j++)

                                m_Houses[row,j] = 0;

                }

 

                 // 查找所有放置的可能。

                public void Solve(int row)

                {

                         // 如果这是最后以行,说明前面的所有行上都成功放置了皇后

                        if(row == m_N -1)

                        {

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

                                {

                                    // 如果当前位置可以放置,说明找到一个解

                                        if(isCurrentCanPlaced(row,col) == true)

                                        {

                                                m_Houses[row,col] = 1;

                                                Console.WriteLine("*********  " + (++resultNum).ToString() + "  *************");

                                                Display();

                                                Console.WriteLine();

                                                m_Houses[row,col] = 0;

                                        }

                                }

                                return ;

                        }

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

                        {

                                ResetRow(row);

                                if(isCurrentCanPlaced(row,col) == true)

                                {

                                        m_Houses[row,col] = 1;

                                        Solve(row + 1);

                                }

                        }

                }

 

                public static void Main()

                {

                        NQueen a= new NQueen(4);

                        a.Solve(0);

                }

        }

}

 

执行结果如下:

**********  1  ************

0 1 0 0

0 0 0 1

1 0 0 0

0 0 1 0

 

**********  2  ************

0 0 1 0

1 0 0 0

0 0 0 1

0 1 0 0

 
原创粉丝点击