八皇后问题,网上多是运用数组和递归进行回溯求解,本人运用了栈存储已经完成的步骤和将来的可能步骤,运用回溯求出了八皇后问题的一个解。
import dataStructure.linearList.LinkStack;
import dataStructure.linearList.LinkList;
public class EightQueen {
public static void main(String[] args) throws Exception{
Board bd= new Board();
LinkStack<Item> ls = new LinkStack();
System.out.println("初始化棋盘:");
bd.display();
for (int i=7;i>=0;i--) //将棋盘全部棋盘格作为开始时的初始候选路径加入栈
for (int j=7;j>=0;j--)
ls.push(bd.getItem(i,j));
System.out.println("正在计算中 ...");
int count = 0;
while (count <8 ) {
Item item = ls.peek();
if (item.getValue() == 0) { //当前栈顶棋盘格为候选路径
item.setValue(1); //将其作为确定路径
count++;
pushNextStep(bd,ls); //并向栈中加入下一步的候选棋盘格
}
else{ //当前棋盘格为确定路径,并且其后没有下一步的候选路径
item = ls.pop();
item.setValue(0);
count--;
if (ls.isEmpty()) {
System.out.println("不能实现八皇后!");
return;
}
}
}
System.out.println("其中一个解:");
bd.display();
}
public static void pushNextStep(Board bd, LinkStack ls) throws Exception{
Item nextItem;
for(int p = 7; p>=0 ;p--){
for(int q = 7;q>=0;q--){
nextItem = bd.getItem(p,q );
int flag = 1;//设置标志变量flag判断nextItem是否满足所有条件
if ( nextItem!=null && nextItem.getValue()==0){
flag = 0;
//其同横线、同竖线、同斜线上都不能有皇后
for(int i = 0; i<8;i++){
if(bd.getItem( i,q).getValue()==1){
flag = 1;//只要有皇后了,flag即为0
break;
}
}
for(int j = 0; j<8;j++){
if(flag==0&&bd.getItem( p,j ).getValue()==1){//如果flag=1了,就不需要再判断了
flag = 1;
break;
}
}
for(int m = -7; m<8 ;m++){
if(flag==0&&p+m>=0&&p+m<8&&q+m>=0&&q+m<8&&bd.getItem(p+m,q+m).getValue()==1){
flag = 1;
break;
}
}
for(int n = -7; n<8 ;n++){
if(flag==0&&p+n>=0&&p+n<8&&q-n>=0&&q-n<8&&bd.getItem(p+n,q-n).getValue()==1){
flag = 1;
break;
}
}
}
if(flag==0)
ls.push(nextItem);
}
}
}
}
//棋盘格类
class Item{
private int x; //x坐标
private int y; //y坐标
private int value; //0--当前棋盘格没有放皇后;1--当前棋盘格放了皇后
Item(int x,int y,int value){
this.x = x;
this.y = y;
this.value = value;
}
public void setX(int x){
this.x = x;
}
public void setY(int y){
this.x = x;
}
public void setValue(int value){
this.value = value;
}
public int getX(){
return this.x;
}
public int getY(){
return this.y;
}
public int getValue(){
return this.value;
}
public String toString(){
return "(" + x + "," + y +") ";
}
]
运行效果: