GDI+学习(7) 八皇后问题回溯算法演示系统

通过,几天的学习研究,对c#绘图的基本的应用已经有了一定的了解,因此决定写一个程序检验一下学习的成果。恰好,本人一直在研究算法,虽然水平不是很高,但是也经常和一些朋友探讨。有些刚刚学习算法的人往往因为对算法的执行过程没有直观的认识,因此我就萌生了做算法演示系统的想法。

       这次做的算法演示,是八皇后问题的回溯算法。想当年我也是费了好大劲才掌握回溯算法,因此,很渴望有一个软件能够帮助到大家,不知道我做的这个软件对你们是否有帮助。

       首先,让我们看一下这个问题的描述。八皇后问题说的是在8*8国际象棋棋盘上,要求在每一行放置一个皇后,且能做到在竖方向,斜方向都没有冲突。更通用的描述就是有没有可能在一张N*N的棋盘上安全地放N个皇后?

让我们回忆下,八皇后问题的回溯算法,我的博文有c语言描述的算法实现http://blog.csdn.net/ljc_zy/archive/2006/03/17/627157.aspx。具体的算法描述,大家google一下吧:)。

       C#版本的回溯算法如下:

           class q

    {

        const int n=8;

        int[] x = new int[n];

        int count;

        public void dosearch()

        {

            traceback(0);

            System.Windows.Forms.MessageBox.Show(count.ToString());

        }

        private bool CanSet(int t)

        {

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

            {

                if (x[i] == x[t] || System.Math.Abs(x[t] - x[i]) == t - i)

                    return false;

 

            }

            return true;

        }

        private void

            traceback(int t)

        {

            if (t >= n)

            {

                count++;

                return;

            }

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

            {

                x[t] = i;

                if (CanSet(t))

                    traceback(t + 1);

            }

           

        }

    }

       现在我要做一个算法,演示算法的执行过程。这里用到前面GDI+学习系列的知识。如在bitmap上作图,防屏幕刷新。也有一些新的东西,如截取部分图片并保存,多线程后台执行等。

       对于八皇后问题我们知道有92种合法的布局,本演示系统提供保存合法布局为jpg文件的功能,保存的内容在可执行文件夹下,以picture+序号为文件名,如第一个搜索的布局保存的文件名是picture1.jpg。下面给出几个布局文件。

 

 picture1.jpg

picture2.jpg

picture3.jpg

请需要源代码用于学习算法或用于算法教学的在本人网站http://www.iwebtrados.com.cn/post/50.html留下邮箱索取源代码和可执行文件。

你可能感兴趣的:(八皇后)