本文实例讲述了Java基于循环递归回溯实现八皇后问题。分享给大家供大家参考,具体如下:
运行效果图如下:
棋盘接口
1
2
3
4
5
6
7
8
9
|
/**
* 棋盘接口
* @author Administrator
*
*/
public interface Piece {
abstract boolean isRow( int line);
abstract boolean isCol( int line, int col);
}
|
棋盘类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
/**
* 棋盘
* @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-------------" );
}
}
|
皇后类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/**
* 皇后
* @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 ;
}
}
|
启动:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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程序设计有所帮助。