package mypack1;public class Queen { 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_OCCUPY_CANCELED = 0;//未占领状态
public Queen(int size){
//初始化
this.size = size;
location = new int[size];
colsOccupied =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]==1) ||
(cross1Occupied[i-j+size-1]==1) ||
(cross2Occupied[i+j]==1);
}
/**如果参数flag为1,表示占领位置(i,j);
* 如果参数flag为0,表示取消占领位置(i,j)
*/
private void setStatus(int i,int j,int flag){
colsOccupied[j] = flag;//宣布占领或取消占领第j列
cross1Occupied[i-j+size-1] = flag;//宣布占领或取消正对角线
cross2Occupied[i+j] = flag;//宣布占领或取消反对角线
}
/**从第i行开始摆放皇后*/
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();
}
//回朔,撤销占领位置(i,j)
setStatus(i,j,STATUS_OCCUPY_CANCELED);
}
}
public void start(){
place(0);//从第0行开始放置皇后
}
public static void main(String[] args){
new Queen(8).start();
}
}
谁能给我解释一下下面的两句是什么意思,我看不懂,还有,正对角线在这里是什么意思啊。
cross1Occupied[i-j+size-1] = flag;//宣布占领或取消正对角线
cross2Occupied[i+j] = flag;//宣布占领或取消反对角线
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_OCCUPY_CANCELED = 0;//未占领状态
public Queen(int size){
//初始化
this.size = size;
location = new int[size];
colsOccupied =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]==1) ||
(cross1Occupied[i-j+size-1]==1) ||
(cross2Occupied[i+j]==1);
}
/**如果参数flag为1,表示占领位置(i,j);
* 如果参数flag为0,表示取消占领位置(i,j)
*/
private void setStatus(int i,int j,int flag){
colsOccupied[j] = flag;//宣布占领或取消占领第j列
cross1Occupied[i-j+size-1] = flag;//宣布占领或取消正对角线
cross2Occupied[i+j] = flag;//宣布占领或取消反对角线
}
/**从第i行开始摆放皇后*/
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();
}
//回朔,撤销占领位置(i,j)
setStatus(i,j,STATUS_OCCUPY_CANCELED);
}
}
public void start(){
place(0);//从第0行开始放置皇后
}
public static void main(String[] args){
new Queen(8).start();
}
}
谁能给我解释一下下面的两句是什么意思,我看不懂,还有,正对角线在这里是什么意思啊。
cross1Occupied[i-j+size-1] = flag;//宣布占领或取消正对角线
cross2Occupied[i+j] = flag;//宣布占领或取消反对角线
看我的这篇Blog吧 解释了一下http://blog.csdn.net/justinavril/archive/2008/08/02/2758636.aspx