八皇后的问题👸 | 刷题打卡

129 阅读1分钟

一、题目描述💯

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

五.测试结果

代码下载地址

感谢🙇‍

点赞支持👍