本文实例讲述了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程序设计有所帮助。