Java基于循环递归回溯实现八皇后问题算法示例

 更新时间:2017年06月12日 08:49:09   作者:qq7342272  
这篇文章主要介绍了Java基于循环递归回溯实现八皇后问题算法,结合具体实例形式分析了java的遍历、递归、回溯等算法实现八皇后问题的具体步骤与相关操作技巧,需要的朋友可以参考下

本文实例讲述了Java基于循环递归回溯实现八皇后问题。分享给大家供大家参考,具体如下:

运行效果图如下:

棋盘接口

/**
 * 棋盘接口
 * @author Administrator
 *
 */
public interface Piece {
  abstract boolean isRow(int line);
  abstract boolean isCol(int line,int col);
}

棋盘类:

/**
 * 棋盘
 * @author Administrator
 *
 */
public class Chessboard implements Piece {
  static boolean[][] che = null;
  public int row;
  public int col;
  private int num=0;
  public Chessboard (int row,int col){
    this.che=new boolean[row][col];
    this.row=row;
    this.col=col;
  }
  //当前行是否能放棋子
  public boolean isRow(int line){
    for (int i = 0; i < this.row; i++) {
      if (che[i][line] == true) {
        return false;
      }
    }
    return true;
  }
  //棋子边角
  public boolean isCol(int line,int col){
    int i = 0, j = 0;
    for (i = line, j = col; i < this.row && j < this.row; i++, j++) { //右下角;
      if (che[i][j] == true) {
        return false;
      }
    }
    for (i = line, j = col; i >= 0 && j >= 0; i--, j--) { //左上角;
      if (che[i][j] == true) {
        return false;
      }
    }
    for (i = line, j = col; i >= 0 && j < this.row; i--, j++) { // 右上角;
      if (che[i][j] == true) {
        return false;
      }
    }
    for (i = line, j = col; i < this.row && j >= 0; i++, j--) { //左下角;
      if (che[i][j] == true) {
        return false;
      }
    }
    return true;
  }
  public void pr() {//打印满足条件的摆放方法
    num++;
    System.out.println("第" + num + "种方式");
    System.out.print("-------------start-------------");
    for (int i = 0; i < this.row; i++) {
      System.out.println();
      for (int j = 0; j < this.row; j++) {
        if (che[i][j] == true) {
          System.out.print("Q ");
        } else {
          System.out.print(". ");
        }
      }
    }
    System.out.println();
    System.out.println("-------------end-------------");
  }
}

皇后类

/**
 * 皇后
 * @author Administrator
 *
 */
public class empress {
  private Chessboard che=null;
  private int count=0;
  private int row=0;
  public empress(int row,int col){
    this.che=new Chessboard(row,col);
    this.row=row;
  }
  //主要的递归实现方法
  public void mk(int line) {
    if (line > this.row-1)
      return;//超过行则退出
    for (int i = 0; i < this.row; i++) {
      if (che.isRow(i) && che.isCol(line,i)) { //ture 为可以摆皇后;
        che.che[line][i] = true; //
        count++; //
        if (count > this.row-1) {
          che.pr();//摆放皇后8个则打印结果
        }
        mk(line + 1);//递归
        che.che[line][i] = false; //回溯
        count--;
        continue;
      }
    }
    return;
  }
}

启动:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class start {
  public static void main(String[] args) {
    String inputrow = JOptionPane.showInputDialog("输入行:");
    int row = Integer.parseInt(inputrow);
    String inputcol = JOptionPane.showInputDialog("输入列:");
    int col = Integer.parseInt(inputcol);
    empress emp=new empress(row,col);
    emp.mk(0);
  }
}

更多关于java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《java日期与时间操作技巧汇总》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java获得当前时间前指定几个小时具体时间的方法示例

    Java获得当前时间前指定几个小时具体时间的方法示例

    这篇文章主要介绍了Java获得当前时间前指定几个小时具体时间的方法,涉及java使用Calendar针对日期时间的相关运算与转换操作技巧,需要的朋友可以参考下
    2017-08-08
  • SWT(JFace) 简易浏览器 制作实现代码

    SWT(JFace) 简易浏览器 制作实现代码

    SWT(JFace) 简易浏览器 制作实现代码
    2009-06-06
  • springboot后端使用LocalDate接收日期的问题解决

    springboot后端使用LocalDate接收日期的问题解决

    在做Java开发时,肯定会碰到传递时间参数的情况,本文主要介绍了springboot后端使用LocalDate接收日期的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Java高并发BlockingQueue重要的实现类详解

    Java高并发BlockingQueue重要的实现类详解

    这篇文章主要给大家介绍了关于Java高并发BlockingQueue重要的实现类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java中对象的销毁方法分析

    Java中对象的销毁方法分析

    这篇文章主要介绍了Java中对象的销毁方法,较为详细的分析了对象的功能、用法及销毁对象对于程序运行的益处,需要的朋友可以参考下
    2015-04-04
  • SpringSecurity的@EnableWebSecurity注解详解

    SpringSecurity的@EnableWebSecurity注解详解

    这篇文章主要介绍了SpringSecurity的@EnableWebSecurity注解详解,@EnableWebSecurity是开启SpringSecurity的默认行为,它的上面有一个Import注解导入了WebSecurityConfiguration类,就是往IOC容器中注入了WebSecurityConfiguration这个类,需要的朋友可以参考下
    2023-11-11
  • Java连接ftp服务器实例代码

    Java连接ftp服务器实例代码

    这篇文章主要介绍了Java连接ftp服务器实例代码 的相关资料,需要的朋友可以参考下
    2015-12-12
  • SpringBoot实现邮件发送功能的姿势分享

    SpringBoot实现邮件发送功能的姿势分享

    我们在日常开发中,经常会碰到email邮件发送的场景,如发送验证码,向客户发送邮件等等,这篇文章主要给大家介绍了关于SpringBoot实现邮件发送的相关资料,需要的朋友可以参考下
    2021-08-08
  • 详解如何独立使用ribbon实现业务客户端负载均衡

    详解如何独立使用ribbon实现业务客户端负载均衡

    这篇文章主要为大家介绍了详解如何独立使用ribbon实现业务客户端负载均衡,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java SpringBoot 使用拦截器作为权限控制的实现方法

    Java SpringBoot 使用拦截器作为权限控制的实现方法

    这篇文章主要介绍了Java SpringBoot 使用拦截器作为权限控制的实现,文中通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10

最新评论