本文实例讲述了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程序设计有所帮助。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。