javascript递归回溯法解八皇后问题
下面给大家分享的是回溯法解八皇后,带详细注解,这里就不多废话了。
functionNQueens(order){
if(order<4){
console.log('NQueensproblemapplyfororderbiggerthan3!');
return;
}
varnQueens=[];
varbackTracking=false;
rowLoop:
for(varrow=0;row<order;row++){
//若出现row小于0,则说明问题无解
if(row<0){
console.log('ThisNQueensproblemhasnosolution!');
break;
}
//第一次检测到新的一行
if(nQueens[row]===undefined){
nQueens[row]=[];
}
//回溯时运行的程序块
for(varcol=0;col<order;col++){
//0为已经检测过并为能放置皇后的位置
if(nQueens[row][col]===0){
continue;
}
//回溯过程中,遇到能放皇后的位置,说明这个位置在后面的验证没有通过,需要重新处理
elseif(backTracking&&nQueens[row][col]==1){
//回溯时发现,上一行也到行末,需要继续回溯
if(col===order-1){
resetRow(nQueens,order,row);
row=row-2;
continuerowLoop;
}
//回溯的行还没到行尾,标0,继续
nQueens[row][col]=0;
backTracking=false;
continue;
}
//放置一个皇后
nQueens[row][col]=1;
//找到一个可以放置皇后的位置,跳出到下一行(一行上只能放一个皇后)。
if(isQueenValid(nQueens,row,col)){
continuerowLoop;
}
//每一行都应该有一个皇后,到列尾了还没有找到合适的位置,说明前面的皇后放置有问题,需要回溯!
elseif(col==order-1){
backTracking=true;
//0与1都表示这个位置已经检测过,因此要将本行清为undefined
resetRow(nQueens,order,row);
//减2是因为循环尾还有个自加,其实就是回到上一行
row=row-2;
//退到外层循环,继续
continuerowLoop;
}else{
//未到行未,继续检测未检测过的
nQueens[row][col]=0;
continue;
};
}
}
returnnQueens;
}
//回溯前,将本行清除
functionresetRow(nQueens,order,row){
for(varcol=0;col<order;col++){
nQueens[row][col]=undefined;
}
}
//检测位置是否能放置皇后
functionisQueenValid(nQueens,row,col){
//行检测
for(vari=0;i<col;i++){
if(nQueens[row][i]==1){
returnfalse;
}
}
for(varj=1;j<row+1;j++){
//列检测左上45度右上45度
if(nQueens[row-j][col]==1||(nQueens[row-j][col-j]==1)||(nQueens[row-j][col+j]==1)){
returnfalse;
}
}
returntrue;
}
functionprintQ(queens){
for(varrow=0;row<queens.length;row++){
varrowText='';
for(varcol=0;col<queens.length;col++){
if(queens[row][col]===undefined){
queens[row][col]=0;
}
rowText=rowText+queens[row][col]+'';
}
console.log(rowText);
}
}
varqueens=NQueens(8);
printQ(queens);
以上就是本文的全部内容了,希望大家能够喜欢。