/*  * Created on 2003-3-28  * n皇后问题算法。  * 把棋盘看成一个坐标系,以左下角为原点(0,0)。坐标系的每个点为一个Point类。  * 每个皇后为一个皇后对象Queen。  * 判断一个点的坐标是否在,一个皇后控制的范围的函数为Queen.isUnderControl(point)。  *   */ package bia.arithmetic; 
import java.util.Date; 
/**  * @author Administrator  *  * To change this generated comment go to   * Window>Preferences>Java>Code Generation>Code and Comments  */ public class EightQueen { 
 Queen[] stack = new Queen[8];  int sp = 0;  int num = 0; 
 public EightQueen() {   num = 8;   stack = new Queen[num];   sp = 0;  } 
 public EightQueen(int num) {   this.num = num;   stack = new Queen[num];   sp = 0;  } 
 /**   * 打印皇后的坐标列表。   * @renzc   *   */  public void list() {   System.out.println("Begin list the stack Point:");   for (int i = 0; i < sp; i++) {    stack[i].pos.println();   }   System.out.println("End list the stack Point:");  } 
 /**   * 主算法流程。   * @Administrator   *   */  public void calc() {   sp = 0;   stack[sp++] = new Queen();   while (sp >= 0 && sp <= num - 1) {    Queen queen = getQueen(sp);    if (null == queen) {     boolean flag = true;     while (flag) {      --sp;      if (sp < 0)       break;      if (stack[sp].pos.y == num - 1) { 
     }      else {       stack[sp++].pos.y++;       flag = false;       for (int k = 0; k < sp - 1; k++) {        if (stack[k].isUnderControl(stack[sp - 1].pos)) {         flag = true;         break;        }       }      }     } 
   }    else {     stack[sp++] = queen;    }   }    } 
 public Queen getQueen(int x) {   boolean flag = true;   int y = 0;   while (flag) {    flag = false;    for (int i = 0; i < x; i++) {     if (stack[i].isUnderControl(new Point(x, y))) {      flag = true;      break;     }    }    if (flag && y <= num - 1) {     y++;    }    else if (y >= num) {     return null;    }   }   return new Queen(new Point(x, y));  } 
 public static void main(String[] args) {   EightQueen a = new EightQueen(20);   long start = new Date().getTime();   System.out.println("起始时间:[" + start + "]");   a.calc();   long end = new Date().getTime();   System.out.println("截止时间:[" + end + "]");   System.out.println("共耗时:[" + (end - start) + "]毫秒");   if (a.sp > 0) {    a.list();   }   else {    System.out.println("这个题目无解!");   }  } } 
class Point {  int x, y; 
 public void println() {   System.out.println("The Point is [x,y]=[" + x + "," + y + "]");  } 
 public Point() {   x = 0;   y = 0;  } 
 public Point(int x, int y) {   this.x = x;   this.y = y;  }  /**   * @return int   */  public int getX() {   return x;  } 
 /**   * @return int   */  public int getY() {   return y;  } 
 /**   * Sets the x.   * @param x The x to set   */  public void setX(int x) {   this.x = x;  } 
 /**   * Sets the y.   * @param y The y to set   */  public void setY(int y) {   this.y = y;  } } 
class Queen {  Point pos;  public Queen() {   pos = new Point();  }  public Queen(Point pos) {   this.pos = pos;  }  public boolean isUnderControl(Point point) {   boolean ret = true;   if (point.x != pos.x    && point.y != pos.y    && Math.abs(point.x - pos.x) != Math.abs(point.y - pos.y)    && Math.abs(point.x + point.y) != Math.abs(pos.x + pos.y)) {    ret = false;   }   return ret;  } }  
 
  |