八皇后问题(递归)
如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
/*
* 8*8的棋盘方格
* 每一行的某一列上要有一个皇后
* */
public class EightQueen {
public static int count=0;
public static boolean noDanger(int row,int col,int chess[][]) {
//这一列
for(int i=0;i<8;i++) {
if(chess[i][col]==1)
return false;
}
//左上方
for(int i=1;row-i>=0&&col-i>=0;i++) {
if(chess[row-i][col-i]==1)
return false;
}
//左下方
for(int i=1;row+i<8&&col-i>=0;i++) {
if(chess[row+i][col-i]==1)
return false;
}
//右上方
for(int i=1;row-i>=0&&col+i<8;i++) {
if(chess[row-i][col+i]==1)
return false;
}
//右下方
for(int i=1;row+i<8&&col+i<8;i++) {
if(chess[row+i][col+i]==1)
return false;
}
return true;
}
public static void EQueen(int row,int col,int chess[][]) {
//当前棋盘的复制
int chess2[][];
chess2 = chess.clone();
//if判断是否八行部排好了,true:打印出棋盘
if(row == 8) {
count++;
System.out.println("第"+count+"种");
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++) {
System.out.print(chess2[i][j]+" ");
}
System.out.println();
}
}
//else 在当前行中进行尝试出符合的列然后进行递归调用
else{
//有一个for循环当前行中的所有列
for(int j=0;j<col;j++) {
//有一个if判断可行列,需要一个函数,true:将这一格填为1,行加1然后进行调用
if(noDanger(row,j,chess2)) {
chess2[row][j] = 1;
EQueen(row+1,col,chess2);
}
//回退后,将原来这一行的这一列的1置为0;
chess2[row][j] = 0;
}
}
}
public static void main(String[] args) {
int chess[][] = new int[8][8];
EQueen(0,8,chess);
}
}
noDanger函数中的判断斜线的另一种方式:
int plus = row+col; //右下划线,第每个点的row+col都相等
int minus = row-col; //左下划线,第每个点的row-col都相等
for(int i=0;i<8;i++) {
for(int j=0;j<8;j++) {
if(i+j==plus&&chess[i][j]==1)
return false;
if(i-j==minus&&chess[i][j]==1)
return false;
}
}
return true;