/**
-
@Author: Ember
-
@Date: 2021/3/13 16:32
-
@Description: 八皇后问题
*/
public class EightQueens {
/**
-
使用二维数组代表棋盘
-
1:代表已经摆了皇后
-
0:代表未摆放
*/
private int[][] spotTaken;
/**
- 标识摆第几个皇后
*/
private int numQueen;
/**
- 八皇后满足条件
*/
private final int EIGHT_QUEEN = 8;
/**
- 初始化棋盘和第几个皇后
*/
public EightQueens() {
//对棋盘进行初始化
spotTaken = new int[8][8];
for (int i = 0; i < spotTaken.length; i++) {
for (int j = 0; j < spotTaken.length; j++) {
spotTaken[i][j] = 0;
}
}
numQueen = 0;
}
/**
-
检验新摆的皇后是否合理
-
@param row
-
@param column
-
@return
*/
private boolean isLegal(int row,int column){
//检查行列
for (int i = 0; i < this.spotTaken.length; i++) {
//检查行
if(i != column && this.spotTaken[row][i] == 1){
return false;
}
//检查列
if (i != row && this.spotTaken[i][column] == 1){
return false;
}
}
//检查主对角线下方
for(int i = row,j = column; i < spotTaken.length && j < spotTaken.length;i++,j++){
//检查主对角线的下方
if(i != row && j != column && spotTaken[i][j] == 1){
return false;
}
}
//检查主对角线上方
for(int i = row,j = column; i >= 0 && j >= 0;i–,j–){
if(i != row && j != column && spotTaken[i][j] == 1){
return false;
}
}
//检查副对角线下方
for(int i = row,j = column;i < spotTaken.length && j >= 0;i++,j–){
if( i != row && j != column && spotTaken[i][j] == 1){
return false;
}
}
//检查副对角线上方
for(int i = row,j = column;i >= 0 && j < spotTaken.length;i–,j++){
if( i != row && j != column && spotTaken[i][j] == 1){
return false;
}
}
return true;
}
/**
-
检查皇后是否可以放在这个位置
-
@param row
-
@param column
-
@return
*/
private boolean isCanPut(int row,int column){
return this.spotTaken[row][column] != 1;
}
/**
-
放入一个皇后,
-
@return
*/
private boolean dealEightQueen(int numQueen,int[][] spotTaken){
//检验是否已经放了八个皇后
if(numQueen == EIGHT_QUEEN){
return true;
}
for (int i = 0; i < spotTaken.length; i++) {
for (int j = 0; j < spotTaken.length; j++) {
//检验该位置是否可以放皇后且是否合理
if(isCanPut(i,j) && isLegal(i,j)){
//如果可以放且位置合理,就放入皇后
spotTaken[i][j] = 1;
//递归寻找另一个可能解,即下一个皇后可能存在的位置
if(dealEightQueen(numQueen+1,spotTaken)){
return true;
}
//如果下一层递归的解都不符合,那么就要回到这一层,将皇后移除,寻找另一个解
spotTaken[i][j] = 0;
}
最后
毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节
美团面试经验
字节面试经验
菜鸟面试经验
蚂蚁金服面试经验
唯品会面试经验
因篇幅有限,图文无法详细发出
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
59625)]
菜鸟面试经验
[外链图片转存中…(img-9cmZmHYa-1725476459625)]
蚂蚁金服面试经验
[外链图片转存中…(img-qe2X6Ewk-1725476459625)]
唯品会面试经验
[外链图片转存中…(img-lduKOx20-1725476459625)]
因篇幅有限,图文无法详细发出
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0