Java使用回溯算法解决八皇后问题

/**

  • @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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值