第一次实验,8皇后问题算法

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;
    }
 
    /*打印皇后的坐标列表。*/
    public void list() {
      System.out.println("开始列表中堆栈指针以及8皇后问题的解:");
      for (int i = 0; i < sp; i++) {
       stack[i].pos.println();
      }
      System.out.println("结束列表堆栈指针:");
    }
 
    /*主算法流程。@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);
      a.calc();
      if (a.sp > 0) {
       a.list();
      }
      else {
       System.out.println("这个问题无解!");
      }
    }
    }
 
    class Point {
    int x, y;
 
    public void println() {
      System.out.println("指针是 :[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;
    }
 
    /**
      * 设置 x.
      * @param x The x to set
      */
    public void setX(int x) {
      this.x = x;
    }
 
    /**
      * 设置 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;
    }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值