八皇后

来源:互联网 发布:简单服装设计软件 编辑:程序博客网 时间:2024/05/17 00:13
Code:
  1. public class EightQueen {   
  2.   
  3. Queen[] stack = new Queen[8];   
  4. int sp = 0;   
  5. int num = 0;   
  6.   
  7. public EightQueen() {   
  8.   num = 8;   
  9.   stack = new Queen[num];   
  10.   sp = 0;   
  11. }   
  12.   
  13. public EightQueen(int num) {   
  14.   this.num = num;   
  15.   stack = new Queen[num];   
  16.   sp = 0;   
  17. }   
  18.   
  19. /**  
  20.   * 打印皇后的坐标列表。  
  21.   * @renzc  
  22.   *  
  23.   */  
  24. public void list() {   
  25.   System.out.println("Begin list the stack Point:");   
  26.   for (int i = 0; i < sp; i++) {   
  27.    stack[i].pos.println();   
  28.   }   
  29.   System.out.println("End list the stack Point:");   
  30. }   
  31.   
  32. /**  
  33.   * 主算法流程。  
  34.   * @Administrator  
  35.   *  
  36.   */  
  37. public void calc() {   
  38.   sp = 0;   
  39.   stack[sp++] = new Queen();   
  40.   while (sp >= 0 && sp <= num - 1) {   
  41.    Queen queen = getQueen(sp);   
  42.    if (null == queen) {   
  43.     boolean flag = true;   
  44.     while (flag) {   
  45.      --sp;   
  46.      if (sp < 0)   
  47.       break;   
  48.      if (stack[sp].pos.y == num - 1) {   
  49.   
  50.      }   
  51.      else {   
  52.       stack[sp++].pos.y++;   
  53.       flag = false;   
  54.       for (int k = 0; k < sp - 1; k++) {   
  55.        if (stack[k].isUnderControl(stack[sp - 1].pos)) {   
  56.         flag = true;   
  57.         break;   
  58.        }   
  59.       }   
  60.      }   
  61.     }   
  62.   
  63.    }   
  64.    else {   
  65.     stack[sp++] = queen;   
  66.    }   
  67.   }     
  68. }   
  69.   
  70. public Queen getQueen(int x) {   
  71.   boolean flag = true;   
  72.   int y = 0;   
  73.   while (flag) {   
  74.    flag = false;   
  75.    for (int i = 0; i < x; i++) {   
  76.     if (stack[i].isUnderControl(new Point(x, y))) {   
  77.      flag = true;   
  78.      break;   
  79.     }   
  80.    }   
  81.    if (flag && y <= num - 1) {   
  82.     y++;   
  83.    }   
  84.    else if (y >= num) {   
  85.     return null;   
  86.    }   
  87.   }   
  88.   return new Queen(new Point(x, y));   
  89. }   
  90.   
  91. public static void main(String[] args) {   
  92.   EightQueen a = new EightQueen(20);   
  93.   long start = new Date().getTime();   
  94.   System.out.println("起始时间:[" + start + "]");   
  95.   a.calc();   
  96.   long end = new Date().getTime();   
  97.   System.out.println("截止时间:[" + end + "]");   
  98.   System.out.println("共耗时:[" + (end - start) + "]毫秒");   
  99.   if (a.sp > 0) {   
  100.    a.list();   
  101.   }   
  102.   else {   
  103.    System.out.println("这个题目无解!");   
  104.   }   
  105. }   
  106. }   
  107.   
  108. class Point {   
  109. int x, y;   
  110.   
  111. public void println() {   
  112.   System.out.println("The Point is [x,y]=[" + x + "," + y + "]");   
  113. }   
  114.   
  115. public Point() {   
  116.   x = 0;   
  117.   y = 0;   
  118. }   
  119.   
  120. public Point(int x, int y) {   
  121.   this.x = x;   
  122.   this.y = y;   
  123. }   
  124. /**  
  125.   * @return int  
  126.   */  
  127. public int getX() {   
  128.   return x;   
  129. }   
  130.   
  131. /**  
  132.   * @return int  
  133.   */  
  134. public int getY() {   
  135.   return y;   
  136. }   
  137.   
  138. /**  
  139.   * Sets the x.  
  140.   * @param x The x to set  
  141.   */  
  142. public void setX(int x) {   
  143.   this.x = x;   
  144. }   
  145.   
  146. /**  
  147.   * Sets the y.  
  148.   * @param y The y to set  
  149.   */  
  150. public void setY(int y) {   
  151.   this.y = y;   
  152. }   
  153. }   
  154.   
  155. class Queen {   
  156. Point pos;   
  157. public Queen() {   
  158.   pos = new Point();   
  159. }   
  160. public Queen(Point pos) {   
  161.   this.pos = pos;   
  162. }   
  163. public boolean isUnderControl(Point point) {   
  164.   boolean ret = true;   
  165.   if (point.x != pos.x   
  166.    && point.y != pos.y   
  167.    && Math.abs(point.x - pos.x) != Math.abs(point.y - pos.y)   
  168.    && Math.abs(point.x + point.y) != Math.abs(pos.x + pos.y)) {   
  169.    ret = false;   
  170.   }   
  171.   return ret;   
  172. }   
  173. }  

 

原创粉丝点击