zoukankan      html  css  js  c++  java
  • 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: 
  • 相关阅读:
    轻量化ViewControllers,读文章做的总结
    项目开发一点总结和吐槽
    简要解析XMPP框架及iOSObjectiveC的使用
    分享,iOS国家手机区号代码.plist
    Storyboard中使用UIscrollView添加约束的开发总结
    朋友由一道面试题想到的递归的解决办法
    最精简SQL教程,查漏补疑
    C#操作注册表的两种方法及引申出调用脚本的通用方法
    nunit的最精简教程
    一些基础知识
  • 原文地址:https://www.cnblogs.com/biaoyu/p/2712467.html
Copyright © 2011-2022 走看看