欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    实验报告:回溯法求解N皇后问题(Java实现)(共4页).doc

    • 资源ID:13880606       资源大小:29.50KB        全文页数:4页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    实验报告:回溯法求解N皇后问题(Java实现)(共4页).doc

    精选优质文档-倾情为你奉上实验报告一、实验名称:回溯法求解N皇后问题(Java实现)二、学习知识:回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并以此慢慢地扩大问题规模,迭代地逼近最终问题的解。这种迭代类似于穷举并且是试探性的,因为当目前的可能答案被测试出不可能可以获得最终解时,则撤销当前的这一步求解过程,回溯到上一步寻找其他求解路径。为了能够撤销当前的求解过程,必须保存上一步以来的求解路径,这一点相当重要。三、问题描述N皇后问题:在一个 N * N 的国际象棋棋盘中,怎样放置 N 个皇后才能使 N 个皇后之间不会互相有威胁而共同存在于棋局中,即在 N * N 个格子的棋盘中没有任何两个皇后是在同一行、同一列、同一斜线上。深度优先遍历的典型案例。四、求解思路1、求解思路:最容易想到的方法就是有序地从第 1 列的第 1 行开始,尝试放上一个皇后,然后再尝试第 2 列的第几行能够放上一个皇后,如果第 2 列也放置成功,那么就继续放置第 3 列,如果此时第 3 列没有一行可以放置一个皇后,说明目前为止的尝试是无效的(即不可能得到最终解),那么此时就应该回溯到上一步(即第 2 步),将上一步(第 2 步)所放置的皇后的位置再重新取走放在另一个符合要求的地方如此尝试性地遍历加上回溯,就可以慢慢地逼近最终解了。2、需要解决的问题:如何表示一个 N * N 方格棋盘能够更有效?怎样测试当前所走的试探路径是否符合要求?这两个问题都需要考虑到使用怎样的数据结构,使用恰当的数据结构有利于简化编程求解问题的难度。3、我们使用以下的数据结构:int columncol = row 表示第 col 列的第 row 行放置一个皇后boolean rowExistsi = true 表示第 i 行有皇后boolean ai = true 表示右高左低的第 i 条斜线有皇后(按   顺序从1 2*N -1 依次编号)boolean bi = true 表示左高右低的第 i 条斜线有皇后(按   顺序从1 2*N -1 依次编号)五、算法实现对应这个数据结构的算法实现如下:1. *  2.  * 回溯法求解 N 皇后问题  3.  * author haolloyin  4.  */ 5. public class N_Queens   6.       7.     / 皇后的个数  8.     private int queensNum = 4;  9.  10.     / columni = j 表示第 i 列的第 j 行放置一个皇后  11.     private int queens = new intqueensNum + 1;  12.  13.     / rowExistsi = true 表示第 i 行有皇后  14.     private boolean rowExists = new booleanqueensNum + 1;  15.  16.     / ai = true 表示右高左低的第 i 条斜线有皇后  17.     private boolean a = new booleanqueensNum * 2;  18.  19.     / bi = true 表示左高右低的第 i 条斜线有皇后  20.     private boolean b = new booleanqueensNum * 2;  21.       22.     / 初始化变量  23.     private void init()   24.         for (int i = 0; i < queensNum + 1; i+)   25.             rowExistsi = false;  26.           27.           28.         for(int i = 0; i < queensNum * 2; i+)   29.             ai = bi = false;  30.           31.       32.  33.     / 判断该位置是否已经存在一个皇后,存在则返回 true  34.     private boolean isExists(int row, int col)   35.         return (rowExistsrow | arow + col - 1 | bqueensNum + col - row);  36.       37.  38.     / 主方法:测试放置皇后  39.     public void testing(int column)   40.  41.         / 遍历每一行  42.         for (int row = 1; row < queensNum + 1; row+)   43.             / 如果第 row 行第 column 列可以放置皇后  44.             if (!isExists(row, column)   45.                 / 设置第 row 行第 column 列有皇后   46.                 queenscolumn = row;  47.                 / 设置以第 row 行第 column 列为交叉点的斜线不可放置皇后  48.                 rowExistsrow = arow + column - 1 = bqueensNum + column - row = true;  49.                   50.                 / 全部尝试过,打印  51.                 if(column = queensNum)   52.                     for(int col = 1; col <= queensNum; col+)   53.                         System.out.print("("+col + "," + queenscol + ")  ");  54.                       55.                     System.out.println();  56.                 else   57.                     / 放置下一列的皇后  58.                     testing(column + 1);  59.                   60.                 / 撤销上一步所放置的皇后,即回溯  61.                 rowExistsrow = arow + column - 1 = bqueensNum + column - row = false;  62.               63.           64.       65.       66.     / 测试  67.     public static void main(String args)   68.         N_Queens queen = new N_Queens();  69.         queen.init();  70.         / 从第 1 列开始求解  71.         queen.testing(1);  72.       73.  六、运行结果当 N = 8 时,求解结果如下(注:横坐标为 列数, 纵坐标为 行数): (1,1)  (2,5)  (3,8)  (4,6)  (5,3)  (6,7)  (7,2)  (8,4)    1. (1,1)  (2,6)  (3,8)  (4,3)  (5,7)  (6,4)  (7,2)  (8,5)    2. (1,1)  (2,7)  (3,4)  (4,6)  (5,8)  (6,2)  (7,5)  (8,3)    3. . .  4. . .  5. (1,8)  (2,2)  (3,4)  (4,1)  (5,7)  (6,5)  (7,3)  (8,6)    6. (1,8)  (2,2)  (3,5)  (4,3)  (5,1)  (6,7)  (7,4)  (8,6)    7. (1,8)  (2,3)  (3,1)  (4,6)  (5,2)  (6,5)  (7,7)  (8,4)    8. (1,8)  (2,4)  (3,1)  (4,3)  (5,6)  (6,2)  (7,7)  (8,5)   当 N = 4 时,求解结果如下: 1. (1,2)  (2,4)  (3,1)  (4,3)    2. (1,3)  (2,1)  (3,4)  (4,2)  七、实验小结:1、根据问题选择恰当的数据结构非常重要,就像上面 a 、b 标志数组来表示每一条斜线的编号顺序以及方向都相当重要。看书的时候也是费了些时间来理解的,呼另外,queens col = row 数组只是用了一维而不是二维来表示纵横交错的方格棋盘上特定位置是否有皇后也是比较经济而有意思的。 2、正确运用、组织所确定的数据结构到算法的实现逻辑中也是很重要的,就像代码中的 isExists(int row, int col) 方法内的 (rowExistsrow | arow + col - 1 | bqueensNum + col - row) 就是很明确的理解了尝试放置皇后的位置的 x ,y 坐标与斜线之间的数值关系,才使得算法得以正确执行。当然,对于斜线的编号、顺序也是相当重要的。专心-专注-专业

    注意事项

    本文(实验报告:回溯法求解N皇后问题(Java实现)(共4页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开