八皇后—Java

package queen;

public class queen {

  static boolean col[] = new boolean[8];

  static boolean main_diagonal[] = new boolean[15];

  static boolean counter_diagonal[] = new boolean[15];

  static int record[]=new int[8];

  static int count = 0;

  public static void search(int x) {

    for (int i = 0; i < 8; i++) {

      if (col[i] == false && main_diagonal[i - x + 7] == false && counter_diagonal[i + x] == false) {//这里的判断条件是列可用,主对角线可用,次对角线可用

        record[x]=i;//记录当前列号

        if (x == 7) {//当最后一个安全位置被确定之后,进行计数并画出图像

          count++;

          for (int k = 0; k < 8; k++) {

            for(int j=0;j<8;j++){

              if (j==record[k]) {

                System.out.print("Q");

              }

              else System.out.print("*");

            }

            System.out.println("");

          }

          System.out.println("\n");

          return;//这里的return尤为重要

        }

        col[i] = true;

        main_diagonal[i - x + 7] = true;

        counter_diagonal[i + x] = true;

        search(x + 1);//递归至下一层

        col[i] = false;//回溯时需要解标记

        main_diagonal[i - x + 7] = false;

        counter_diagonal[i + x] = false;

      }

       else//如果当前位置不安全,继续向本行下一个位置遍历

      continue;

    }

  }

  public static void main(String[] args) {

    search(0);

    System.out.println("共有"+count+"解法");

  }

}

时间: 2024-10-05 05:02:03

八皇后—Java的相关文章

八皇后java算法

public class NQueens {  public static int num = 0; // 累计方案总数 public static final int MAXQUEEN = 5;// 皇后个数,同时也是棋盘行列总数 public static int[] cols = new int[MAXQUEEN]; // 定义cols数组,表示n列棋子摆放情况 public NQueens() {  // 核心函数,从第0列开始 getArrangement(0);  System.ou

回溯算法解八皇后问题(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实现八皇后问题(递归和循环两种方式)

循环方式: 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(回溯算法)

八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于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