パズル
nクイーンの問題。 NXNのチェスボードにn女王を配置します。ここでは、同じ列、同じ列、または同じ対角線に2人の女王が攻撃できないようにします。
戦略
バックトラッキング方法。
JavaScriptソリューション
8つの女王の質問を例にとってください。
コードコピーは次のとおりです。
/**
* 12/28/14にChaoによって作成されました。
*/
関数getnquens(注文){
if(注文<4){
console.log( 'n Queensの問題は3'より大きな注文に適用されます);
戻る;
}
var nqueens = [];
var backtracking = false;
Rowloop:
for(var row = 0; row <order; row ++){
if(nqueens [row] === undefined){
nqueens [row] = [];
}
for(var col = 0; col <order; col ++){
if(nqueens [row] [col] === 0){
続く;
} else if(backtracking && nqueens [row] [col] == 1){
if(col === order-1){
restrow(nqueens、order、row);
row = row -2;
rowloopを続行します。
}
nqueens [row] [col] = 0;
バックトラッキング= false;
続く;
}
nqueens [row] [col] = 1;
if(isqueenvalid(nqueens、row、col)){
rowloopを続行します。
} else if(col == order-1){
BackTracking = true;
restrow(nqueens、order、row);
row = row -2;
rowloopを続行します。
} それ以外 {
nqueens [row] [col] = 0;
続く;
};
}
}
nqueensを返します。
}
function resetrow(nqueens、order、row){
for(var col = 0; col <order; col ++){
nqueens [row] [col] =未定義;
}
}
関数isqueenValid(nqueens、row、col){
for(var i = 0; i <col; i ++){
if(nqueens [row] [i] == 1){
falseを返します。
}
}
for(var j = 1; j <row+1; j ++){
if(nqueens [row-j] [col] == 1 ||(nqueens [row-j] [col-j]
falseを返します。
}
}
trueを返します。
}
function printqueens(Queens){
for(var row = 0; row <queens.length; row ++){
var rowtext = '';
for(var col = 0; col <Queens.length; col ++){
if(Queens [row] [col] === undefined){
Queens [row] [col] = 0;
}
rowtext = rowtext + Queens [row] [col] + '';
}
console.log(rowtext);
}
}
var Queens = getnqueens(8);
Printqueens(Queens);
結果
コードコピーは次のとおりです。
1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0