练习N皇后问题,老是报错

撸大师 发布于 2013/02/06 21:39
阅读 70
收藏 0
package test.com;


public class Queen  {


/**
* @param args
* @author 
* @since 1.0
* @version 1.0 
*/
private final int size;//棋盘的大小,也表示皇后的数目
private int[] location;//皇后在棋盘的每行上的列的位置
private int[] colsOccupied;//皇后在棋盘上占据的列
private int[] cross1Occupied;//皇后在棋盘上占据的正对角线
private int[] cross2Occupied;//皇后在棋盘上占据的反对角线
private static int count;//解决方案的个数
private static final int STATUS_OCCUPIED=1;//占领状态
private static final int STATUS_NO_OCCUPIED=0;//未占领状态
public Queen(int size){
this.size=size;
location=new int[size];
cross1Occupied=new int[2*size];
cross2Occupied=new int[2*size];
}
public void printLocation(){
System.out.println("以下是皇后在棋盘上的第"+count+"种摆放位置");
for(int i=0;i<size;i++){
System.out.println("行:"+i+" 列:"+location[i]);
}
}
/**判断位置(i,j)是否被占领*/
private boolean isOccupied(int i,int j){
return (colsOccupied[j]==STATUS_OCCUPIED
||cross1Occupied[i-j+size-1]==STATUS_OCCUPIED
||cross2Occupied[i+j]==STATUS_OCCUPIED);
}
/**如果参数flag为1.表示占领
* 如果参数flag为0,表示取消占领
*/
private void setStatus(int i,int j,int flag){
colsOccupied[j]=flag;//宣布占领或取消占领第j列
cross1Occupied[i-j+size-1]=flag;//宣布占领或取消占领正对角线
cross2Occupied[i+j]=flag;//宣布占领或取消占领反对角线
}
public void place(int i){
for(int j=0;j<size;j++){
if(!isOccupied(i,j)){
location[i]=j;
setStatus(i, j, STATUS_OCCUPIED);
if(i<size-1){
place(i+1);
}else{
count++;
// printLocation();
}
}
setStatus(i, j,STATUS_NO_OCCUPIED);
}
}

public void start(){
place(0);
}

public static void main(String[] args){
// TODO Auto-generated method stub
new Queen(8).start();
}


}

加载中
返回顶部
顶部