码迷,mamicode.com
首页 > 编程语言 > 详细

八皇后(JAVA算法实现)

时间:2016-09-23 18:13:07      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

  在学习现代软件工程构建之法这门课时,老师要求发表一篇博客,使用JAVA算法实现八皇后问题的求解。写这篇博客时,我学习了一些其他的博客,因为我常常遇到问题,自己无法解决时,向他人学习也是一种方法。

  国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

  我们可以逐行或者逐列来进行可行摆放方案的遍历,每一行(或列)遍历出一个符合条件的 位置,接着就到下一行或列遍历下一个棋子的合适位置,这种遍历思路可以保证我们遍历过程中有一个条件是绝对符合的——就是下一个棋子的摆放位置与前面的棋 子不在同一行(或列)。接下来,我们只要判断当前位置是否还符合其他条件,如果符合,就遍历下一行(或列)所有位置,看看是否继续有符合条件的位置,以此 类推,如果某一个行(或列)的所有位置都不合适,就返回上一行(或列)继续该行(或列)的其他位置遍历,当我们顺利遍历到最后一行(或列),且有符合条件 的位置时,就是一个可行的8皇后摆放方案,累加一次八皇后可行方案的个数,然后继续遍历该行其他位置是否有合适的,如果没有,则返回上一行,遍历该行其他 位置,依此下去。这样一个过程下来,我们就可以得出所有符合条件的8皇后摆放方案了。这是递归思路。

   接下来,我们以逐列遍历,具体到代码,进一步说明。首先,从第一列开始找第一颗棋子的合适位置,我们知道,此时第一列的任何一个位置都是合适的,当棋子找 到第一个合适的位置后,就开始到下一列考虑下一个合适的位置,此时,第二列的第一行及第二行显然就不能放第二颗棋子了,因为其与第一个棋子一个同在一行, 一个同在一条斜线上。第二列第三行成为第二列第一个合适的位置,以此类推,第三列的第5行又会是一个合适位置,这个过程中,我们注意到,每一列的合适位置 都是受到前面几列的位置所影响,假设前面1列的棋子放在第3行,那当前列不能放的位置就一定是3行,2行,4行。例如用cols数组来表示8个列棋子所放的行数,数组下标从0开始,其中数组下标表示列数,数组的元素值表示该列棋子所在行数,当前列为N(N>=0,N<8),则:

  cols[N] != cols[N-1]

  cols[N] != cols[N-1]-1

  cols[N]!=cols[N-1]+1

  如果N-2列存在的话,那么我们还要考虑当前列N不与N-2列的棋子同行,同斜线,同反斜线。把当前列N的前面的某一列设为m,则m的所有取值为{m>=0,m<N}的集合,则:

  cols[N] != cols[m]

  cols[N] != cols­­[m] -(N-m)

  cols[N] != cols­­[m] + (N-m)
  具体代码如下:

public class Queen8{ public static int num=0; public static final int MAXQUEEN=8; public static int[] col=new int[MAXQUEEN]; public Queen8(){ getArrangement(0); System.out.print("/n"); System.out.println(MAXQUEEN+“八皇后问题有”+num+“种摆放方法。”); } public void getArrangement(int n){ boolean[] rows=new boolean[MAXQUEEM]; for(int i=0;i=0)rows[cols[i]-d]=true; if(cols[i]+d<=MAXQUEEN-1)rows[col[i]+d]=true; } for(int i=0;i八皇后(JAVA算法实现)

标签:

原文地址:http://www.cnblogs.com/zyx-blogs/p/5878863.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!