利用栈结构和回溯机制求解八皇后问题

八皇后问题,网上多是运用数组和递归进行回溯求解,本人运用了栈存储已经完成的步骤和将来的可能步骤,运用回溯求出了八皇后问题的一个解。

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 +") ";
 	}
 ]

运行效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值