您的位置:首页 > 其它

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

2014-06-12 11:23 204 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: