您的位置:首页 > 大数据 > 人工智能

八皇后问题 -当时写给老师的一封E-mail

2005-12-17 23:37 961 查看
========================ProgramDescription===============

程序文件:queeen.cpp

程序名称:八皇后问题

方 法:1非递归方法 2递归算法 3面向对象方法

程序编写:(ExceedStudio)

注:三个文件以CPP形式,在windowsxp,vc++6.0(sp5) 中顺利通过编译。

=====================================================

算法描述:

一:非递归算法

(我在这个文件中搞了一些提示信息!:))

1 定义一个全局的 char borad[8][8];作为棋盘;

2 编写一个初始化函数 fill_up();,使得 borad全部初始为X;

3 编写一个检测函数 int check(int x,int y);,检测每一行,每一列,正反对角线上是否有Q;

(1) 行: 固定Y,用一个循环编历 borad[i][y];

(2) 列: 固定X,同上borad[x][i];

(3) 对角线: 用一个 while(x>0 && y>0) ,检测borad[x--][y--]是否有Q;

用一个 while(x<8 && y<8),borad[x++][y++]是否有Q;

4 编写一个放Q的函数 place();

(1) 首先确定第一个Q的位置(本程序只用放于第一行!)

(2) 之后的7行,每一行用一个循环来控制(每一行的第一格到第八格)!是用嵌套!

每一个循环调用check(),如果返回一,则放上Q,否则continue;

(3) 在最里的一个循环,就是第7行,当check()成立,则表明摆法正确,输出此时的borad!

否则在这个循环里不能放上Q,表明当前摆法不正确,返回上一个循环的下一个位置!同时使上个循环原先放的Q变为X;

(4) 同理当每一行的循环完后也不用放上Q,则返回上一个循环的下一个位置!

同时使上一个循环原先放的Q变为X;

5 main()部分

(1)调用fill_up,使数组填满X;

......(省略了N步提示信息)

(2)调用place()放置Q

(3)输出结果

二:递归部分

1,2,3与前面相同。

4 同样编写一个place();(其实是对非递归算法的一个简化,使之成为递归!)

(1) 默认第一个Q的位置为第一格(第一行第一列)

(2) 从第二格开始,由一个for来控制列,由n来控制行!

如果可以放下Q(if(check(n,i))),

(3)判断N是否小于7,如果否转到下一个Q(place(n+1))

(4)如果等于7,表明放置成功,打印结果!跳出place()函数;

(5)如果有一行左一个for循环内都不能放下一个Q,则将上一行的Q变为X,

放Q于下一位!不断回溯这一步!(这叫回溯吗~:))

(6)真到成功打印出结果。

三:面向对象方法

基本上是对递归的改写,封装成一个类!只是用了最简单的封装!其它方法没有用个~!

(但有个问题解决不了:我想将类定义和实现分别写在不同文件,虽然写好时可以通过,但移到别的地方后却编译不了,不知是为什么!!)

编写总结

为了编写出正确代码,从开始想到真正完成差不多用了三个星期!前一个半只要是在想如何用非递归的方法实法,当然想左好多方法,但最好都试验过是通不过的。比如我想由一个循环,从第一格开始放,放完第一个后,就从第二行的第一个位开始检测下一个,而其实当放到第四行后,剩下的根本放不下~~~而程序就会就些停止!后来停了几天没想,突然间有一天又有灵感了,之后一直奋斗到深夜三点,终于完成了!总算是自己想出的,虽然是比较冗长!

总结我写的这个算法,排是排出了,但有二个严重制约,1.就是只用放第一个皇后(Q)于第一行中,不过实现放于任意行,之后输出以任意位置上的可能排法!2,就是不可以求出所有的排法!由于没有时间再深入地想了,只好这样了!!但有一点好的就是可以以字符输出数组,比较直观地看到结果!(当然这个方法是参考一些书的)。

因为一直想以非递归方法做一次,所以没有去模仿书的方法,但这也使我可以完全地了解了递归的方法!我想以后对算法都可以这样想一次应该对以后学习新的方法等有很大帮助吧~!

后注:三个文件加起来总行数为550大约,可惜还是搞不到一个1000的项目(J)

(EXCEED STUDIO)

这是我们自己组成的小组,我们都很努学习编程知识!希望以后可以通过我们的共同努力,做出一点成绩!!(虽然我们现在什么出只是起步阶段,相信以后会有很好发展!)

问题

(这部分应该是我们大多数学生的问题材吧,希望老师你有时间可以回复一下!谢谢!)

发E-mail:kejie74@163.com

1 我们应该如何确定自己的学习方向,比如我喜欢软件设计方面,应该如学习,学那里内容可以使我们毕业时可以找到一份安心的工作;

2 如果我决定从事软件方面,那我如何选择自己专攻的语言,因为对于一个新毕业的学生我想先精一门语言会比较好!C++还可以用多久?.NET又出了,应该转过去吗?JAVA,C#这些~~

我们是否也应该在毕业前学好,那学那样好?

3 我想我要从C++学起,准备暑假就搞好数据结构,但之后我又应该如何学习呢?学STL?还是学MFC~~?可以直接转去WINDOWS开发吗~?

4 近来看到有报到手机游戏方面的开发也许有D前途(钱途:)可以吗?嵌入式操作系统又是如何的??

5 大学生创业如何?一个软件公司是如何运作的,如何发展自己的业务~~~(最好可以提供些资料吧!谢谢)

希望老师你有时间回复一下我的问题,再一次感谢!!谢谢++。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: