n皇后问题java_N皇后问题java实现

本文介绍了如何使用Java解决经典的N皇后问题,通过递归方法在n*n棋盘上放置n个皇后,确保它们不会互相攻击。文章展示了包含皇后类、棋盘类和主程序类的代码实现,并给出了八皇后问题的求解示例。
摘要由CSDN通过智能技术生成

N皇后问题是一个典型的约束求解问题,利用递归机制,可以很快的得到结果。

N皇后问题的描述:

在一个n*n的棋盘上,摆放n个皇后,要求每个皇后所在行、列、以及两个对角线上不能出现其他的皇后,否则这些皇后之间将会相互攻击。如下图所示。

0a01cda0e3c71530e4ca74debe4e7ba2.png

利用递归机制,可以很容易的求解n皇后问题。针对八皇后,总共有92种解。下面将给出N-皇后问题的一般求解代码,在这里代码是使用java编码的。

总共设计了三个类,一个是皇后类(Queen),一个棋盘类(Board),一个是求解主程序类(NQueens)。具体代码如下:

1: import java.util.ArrayList;

2: import java.util.List;

3:

4: public class NQueens {

5:

6: private int numSolutions;//求解结果数量

7: private int queenSize;//皇后的多少

8: private Board board;//棋盘

9: private List queens = new ArrayList();//皇后

10: //private List nQueens = new ArrayList();

11:

12: public NQueens(){

13:

14: }

15:

16: public NQueens(int size){

17: numSolutions = 0;

18: queenSize = size;

19: board = new Board(queenSize);

20: for (int i = 0; i < queenSize; i++) {

21: Queen queen = new Queen();

22: queens.add(queen);

23: }

24:

25: }

26:

27: public void solve(){

28: System.out.println("Start solve....");

29: putQueen(0);

30: }

31:

32: private void putQueen(int index){

33:

34: int row = index;

35: //如果此列可用

36: for (int col = 0; col < board.getQueenSize(); col++) {

37: if (board.getLayout()[row][col] == 0) {

38: //将皇后的位置置为此列位置

39: queens.get(row).setPosition(col);

40: //然后将相应的位置(此列的正下方以及两个对角线)加1(即使其不可用)

41: for (int i = row + 1; i < board.getQueenSize(); i++) {

42: board.getLayout()[i][col] ++;

43: if (row + col - i >= 0) {

44: board.getLayout()[i][row + col - i] ++;

45: }

46: if (i + col - row < board.getQueenSize()) {

47: board.getLayout()[i][i + col - row] ++;

48: }

49: }

50:

51: if (row == board.getQueenSize()-1) {

52: numSolutions++;

53: printSolution(numSolutions);

54: }else {

55: putQueen(row + 1);

56: }

57: //回溯,将相应的位置(此列的正下方以及两个对角线)减1

58: for (int i = row + 1; i < board.getQueenSize(); i++) {

59: board.getLayout()[i][col] --;

60: if (row + col - i >= 0) {

61: board.getLayout()[i][row + col - i] --;

62: }

63: if (i + col - row < board.getQueenSize()) {

64: board.getLayout()[i][i + col - row] --;

65: }

66: }

67:

68: }

69: }

70: }

71: //打印求解结果

72: private void printSolution(int i){

73: System.out.println("The"+i+ "solution is:");

74: for (int j = 0; j < board.getQueenSize(); j++) {

75: for (int k = 0; k < board.getQueenSize(); k++) {

76: System.out.print(queens.get(j).getPosition() == k ? "*":"-");

77: }

78: System.out.println();

79: }

80: System.out.println();

81: }

82: /**

83: * @param args

84: */

85: public static void main(String[] args) {

86: //可以改变参数

87: NQueens nQueens = new NQueens(8);

88: nQueens.solve();

89:

90: }

91:

92:

93:

94: }

95: import java.io.Serializable;

96:

97: //皇后类

98: public class Queen implements Serializable, Cloneable {

99:

100: /**

101: *

102: */

103: private static final long serialVersionUID = 7354459222300557644L;

104: //皇后的位置

105: private int position;

106:

107: public Queen(){

108:

109: }

110:

111: public int getPosition() {

112: return position;

113: }

114:

115: public void setPosition(int position) {

116: this.position = position;

117: }

118:

119: public Object clone() throws CloneNotSupportedException {

120:

121: return super.clone();

122: }

123: }

124:

125: import java.io.Serializable;

126:

127: //棋盘类

128: public class Board implements Serializable,Cloneable {

129:

130: /**

131: *

132: */

133: private static final long serialVersionUID = -2530321259544461828L;

134:

135: //棋盘的大小

136: private int queenSize;

137:

138: //棋盘的布局

139: private int[][] layout;

140:

141: public Board(int size){

142: this.queenSize = size;

143: this.layout = new int[queenSize][queenSize];

144: //初始化,使棋盘所有位置都可用,即全部置为0

145: for (int i = 0; i < queenSize; i++) {

146: for (int j = 0; j < queenSize; j++) {

147: layout[i][j] = 0;

148:

149: }

150: }

151: }

152:

153: public int getQueenSize() {

154: return queenSize;

155: }

156:

157: public void setQueenSize(int queenSize) {

158: this.queenSize = queenSize;

159: }

160:

161: public int[][] getLayout() {

162: return layout;

163: }

164:

165: public void setLayout(int[][] layout) {

166: this.layout = layout;

167: }

168:

169: public Object clone() throws CloneNotSupportedException {

170:

171: return super.clone();

172: }

173:

174: }

175:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值