一、题目描述💯
- 在 8*8 的棋盘上,放8个皇后,保证在每一列、每一行、以及对角线上不会出现两个皇后,一共有多少种摆放方法? )
二、思路分析🤔
- 1.初始化一个二维数组(init函数),
注意🚨:0 代表可以放的位置,1 代表不能放的位置,2 代表棋子已放在上面
- 2.每下一个棋子,对棋盘做一次处理(luoZ函数)
- 3.判断棋子的位置受否符合规则,符合则继续落子
三、代码实现
function init(n) {
let arr = []
for (let i = 0; i < n; i++) {
arr[i] = []
for (let j = 0; j < n; j++) {
arr[i][j] = 0;
}
}
return arr
}
let count = 0 //摆放方法的总合
// 落子
function luoZ(x, y, arr) {
//完成落子后的效果
arr[x][y] = 2
//横向
for (let i = y + 1; i < arr[x].length; i++) {
arr[x][i] = 1;
}
//纵向
for (let j = x + 1; j < arr[y].length; j++) {
arr[j][y] = 1;
}
//斜向1
for (let m = x + 1; m < arr[x].length; m++) {
let i = m - x
if(y+i<arr[x].length){
arr[m][y + i] = 1
}
}
//斜向2
for (let d = y - 1; d>=0; d--) {
let s = y - d
if(x+s<arr[y].length){
arr[x+s][d] = 1
}
}
// //斜向
//进入下一层
if (x >=arr[y].length-1) {
count++
console.log("🍎",count,arr);
return arr
}else{
check(x+1, 0, arr)
}
}
//检查是否符合规则
function check(x, y, arr) {
//先检测一下
let spot = false
for (let l = 0; l < arr[x].length; l++) {
if (arr[x][l] == 0) {
spot = true
}
}
if (spot) {
while (y < arr[x].length) {
if (arr[x][y] == 0) {
let _obj = JSON.stringify(arr),
objClone = JSON.parse(_obj);
luoZ(x, y, objClone)
}
y++
}
} else {
// console.log(x, y, "截止第"+x+"行");
}
}
function main(n) {
//初始化
let arr = init(n)
console.log(arr);
for (let i = 0; i <n ; i++) {
let _obj = JSON.stringify(arr),
objClone = JSON.parse(_obj);
luoZ(0, i, objClone)
}
}
main(8);//入口函数 8代表8*8的棋盘
四、简单测试🧪
console.log(main(8))//92