用java实现八皇后

public class Queen8 { 
    public static int num = 0; //累计方案总数 
    public static final int MAXQUEEN = 8;//皇后个数,同时也是棋盘行列总数 
    public static int[] cols = new int[MAXQUEEN]; //定义cols数组,表示8列棋子摆放情况 
    public Queen8() { 
       //核心函数 
      getArrangement(0); 
      System.out.print("\n"); 
      System.out.println(MAXQUEEN+"皇后问题有"+num+"种摆放方法。"); 
    } 
     
    public void  getArrangement(int n){ 
     //遍历该列所有不合法的行,并用rows数组记录,不合法即rows[i]=true 
     boolean[] rows = new boolean[MAXQUEEN]; 
     for(int i=0;i<n;i++){ 
       rows[cols[i]]=true; 
        int d = n-i; 
        if(cols[i]-d >= 0)rows[cols[i]-d]=true; 
        if(cols[i]+d <= MAXQUEEN-1)rows[cols[i]+d]=true;  
       
     } 
     for(int i=0;i<MAXQUEEN;i++){ 
       //判断该行是否合法   
       if(rows[i])continue; 
       //设置当前列合法棋子所在行数 
       cols[n] = i; 
       //当前列不为最后一列时 
       if(n<MAXQUEEN-1){ 
         getArrangement(n+1); 
       }else{ 
 
        //累计方案个数 
         num++; 
         //打印棋盘信息 
         printChessBoard(); 
       }  
       
       
     } 
      
    } 
    public void printChessBoard(){ 
        
       System.out.print("第"+num+"种走法\n"); 
        
       for(int i=0;i<MAXQUEEN;i++){ 
         for(int j=0;j<MAXQUEEN;j++){ 
           if(i==cols[j]){ 
             System.out.print("0 "); 
           }else 
             System.out.print("+ "); 
         } 
         System.out.print("\n"); 
       } 
        
    } 
    public static void main(String args[]){ 
      Queen8 queen = new Queen8(); 
    } 
    
}

时间: 2024-11-13 09:08:03

用java实现八皇后的相关文章

java实现八皇后问题(递归和循环两种方式)

循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVAILABLE = true; private int squares = 8, norm = squares - 1; private int positionInRow[] = new int[squares]; private int p=-1; private boolean[] rows = n

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

八皇后(JAVA算法实现)

在学习现代软件工程构建之法这门课时,老师要求发表一篇博客,使用JAVA算法实现八皇后问题的求解.写这篇博客时,我学习了一些其他的博客,因为我常常遇到问题,自己无法解决时,向他人学习也是一种方法. 国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 我们可以逐行或者逐列来进行可行摆放方案的遍历,每一行(或列)遍历出一个符合条件的 位置,接着就到下一行或列遍历下一个棋子的合适位置,这

简述java递归与非递归算法,0-100求和,斐波那契数列,八皇后,汉诺塔问题

一:什么是递归算法? 递归算法就是直接或者间接的调用自己的方法,在达到一个条件的时候停止调用(递归出口),所以一定要找准好条件,让递归停止,否则就会是无限进行下去 二:递归程序设计的关键 1:找出调用中所需要的参数 2:返回的结果 3:递归调用结束的条件 三:递归程序注意 1:要有方法中自己调用自己 2:要有分支结构 3:要有结束的条件 四:简单叙述递归函数的优缺点 优点: 1:简洁清晰,实现容易,可读性好 2:在遍历的算法中,递归比循环更为简单 缺点: 1:效率低,使用递归函数是有空间和时间的

使用java语言实现八皇后问题

八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子.正确答案为92中,接下来用java语言实现. 解: package eightQuen; /** * 八皇后问题 * * @author 83771 * */ public class eight { // 定义一个数组 表示棋盘 public static Integer[][] checkerBoard = new Integer[8][8]; // 棋盘副本 public stati

八皇后问题——回溯法(python&amp;&amp;JAVA)

八皇后问题,是一个古老而著名的问题,问题如下: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 上边是一个8*8的国际棋盘,可以看到棋盘中的每个格子都标有数字.每个数字都是两位,十位数字表示该格子所在的行,而个位数字表示该格子所在的列. 这样不难发现,处在同一行的两个格子其十位数都相同,处在同一列的两个格子其个位数都相同,处在同一斜线的两个格子有:|两个数字个位数的差|=|两个数字十位数的差|. 主要的三个限制条件明白了

八皇后问题求解java(回溯算法)

八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 代码实现 static int count = 0;//记录有几种方法 int max = 8;//max表示几个皇后 int[] arr = new int[max];//用一个数组表示,其中arr[n]表示放在第arr[n]+1列,n表示第n+1个

【蓝桥杯】经典的八皇后问题

这个问题很经典,不清楚问题描述的可以百度一下,这里就不再赘述了,只列出我的具体做法. import java.util.ArrayList; import java.util.List; class Test8Queens { public static StringBuffer result = new StringBuffer(); public static List<Integer> list = new ArrayList<Integer>(); public stati

八皇后问题解析

今天下午思考了几个小时,最后还是选择走.net,虽然java现在很火,但毕竟学了一学期c#了,本人还是比较细化wp的,所以最后选择了.net.我相信只要学精,不管以后就业如何,都应该差不到哪去. 不扯远了,现在就来说一说八皇后问题.现在我还是大三学生,前几周上java实验课的时候我们实现了全排列问题,还剩一节课,老师就讲了下八皇后问题(就是在8x8的棋盘上,八个皇后两两不能在一条直线上),当时上课没认真听,下课去看有点看不懂,后来去看了其他博主的博文,更是看不懂,最后还是看老师写的代码.细细审看