我们以五皇后为例:
我们先将第一行的所有可能列出来,再从第一个可能开始,判断第二行的可能,如果能一直判断到第五行的皇后位置,那么这种情况是可以放皇后的,如果不行那么我们就从上一行重新找位置判断
class eightQueen{
public static int count=0;
public static void main(String[] args){
//先创建一个8×8的棋盘
int[][] board=new int[8][8];
//0就是空 1就是皇后
eightQueen(board,0);//先传0代表第一行
}
//解决board在第level层的八皇后问题,level的取值是0~7
public static void eightQueen(int[][] board,int level){
if(level==8){//如果递归到了第九行则当前是一个解
count++;
System.out.printf("这是第%d个解:\n",count);
//如果这是一个解的话,则打印棋盘即可
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
System.out.print(board[i][j]+" ");
}
System.out.println();
}
}else{
//做上一个情况的备份
int[][] newBoard=new int[8][8];
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
newBoard[i][j]=board[i][j];
}
}
//遍历当前行,找出所有可能的解
for(int col=0;col<8;col++){
//判断当前位置是否可以放皇后
//如果可以则继续往下找
//如果不行,则继续判断下一个位置
if(isNoDanger(newBoard,level,col)){
//在赋值皇后前,先当前行清空
for(int c=0;c<8;c++){
newBoard[level][c]=0;
}
//放皇后
newBoard[level][col]=1;
//接着下一行找
eightQueen(newBoard,level+1);
}
}
}
}
public static boolean isNoDanger(int[][] board,int x,int y){
//正上
for(int r=x-1;r>=0;r--){
if(board[r][y]==1){
return false;
}
}
//左上
for(int r=x-1,c=y-1;r>=0&&c>=0;r--,c--){
if(board[r][c]==1){
return false;
}
}
//右上
for(int r=x-1,c=y+1;r>=0&&c<8;r--,c++){
if(board[r][c]==1){
return false;
}
}
return true;
}
}