Java基于循环递归回溯实现八皇后问题算法示例
程序员文章站
2023-12-17 11:52:46
本文实例讲述了java基于循环递归回溯实现八皇后问题。分享给大家供大家参考,具体如下:
运行效果图如下:
棋盘接口
/**
* 棋盘接口
* @a...
本文实例讲述了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程序设计有所帮助。