N皇后问题java实现

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

    N皇后问题的描述:

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

image

      利用递归机制,可以很容易的求解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<Queen> queens = new ArrayList<Queen>();//皇后
 10:   //private List<Queen> nQueens = new ArrayList<Queen>();
 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: 

posted on 2012-10-05 20:18  Alex Yu  阅读(5490)  评论(0编辑  收藏  举报

导航