『牛客|每日一题』N皇后问题

简介: 基础算法无论在研究生面试还是求职面试都是十分重要的一环,这里推荐一款算法面试神器:牛客网-面试神器;算法题只有多刷勤刷才能保持思路与手感,大家赶紧行动起来吧(温馨提示:常见的面试问答题库也很nice哦 https://www.nowcoder.com/link/pc_csdncpt_ll_sf

如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦


1.每日一题

原题链接:传送门-》戳我

网络异常,图片无法展示
|

2.解题思路

2.1思路分析

皇后问题很简单,因为每一行,每一列,每条斜线不能有重复的皇后,所以我们只需要从遍历行的角度出发,去检查新的一行里每一列和左右两条斜线是否有皇后冲突,当没有冲突的时候就坐标信息表示放置皇后。当一直找到最后一行时就表示找到了一种摆法,然后回溯去找新的解。

  • step 1:定义一个公共变量记录摆法的种数

//皇后摆法得个数

   publicintans;

  • step 2:用一个一维数组来记录每一列是否放了皇后,数组的下标表示行,值表示列(很巧妙吧,如果是你去保存一个坐标的信息是不是只会开一个二维数组呢)

//记录某一列是否放了皇后

   intcol[]=newint[10];

  • step 3:调用深搜函数,我们按行来深搜,递归的结束条件就是搜索完最后一行后代表找到一种解,开始回溯。

//如果搜索完棋盘的最后一行(下标从0开始最后一行是n-1)

   if(r==n){

       //摆放的方法+1

       ans++;

       return;

   }

  • step 4:如果没有搜索完最后一行,我们就遍历这一行的每一列,首先通过check()检查如果在这一列放是否与之前行已经放好的皇后冲突;如果不冲突的话才放置皇后,就是标记col[]数组,然后往下一行搜索;记得回溯时去皇后 col[r]=0;

//遍历n列

   for(intc=0;c<n;++c){

       //剪枝操作

       if(check(r,c,col)){

           //标记在第r行的第c列放的皇后

           col[r]=c;

           //深度搜索下一行,在下一行放皇后

           dfs(r+1,n,col);

           //回溯,去除标记

           col[r]=0;

       }

   }

  • step 5:第四步中用到了check()函数检查冲突,冲突的检查规则就是不能同行同列同斜线,同行的检查是不需要的因为我们的深搜就是按行进行肯定不会在同一行放两个皇后。检查列就是比对此时的列是否已经被标记(记录过皇后的坐标col[i]==c);检查斜线这里也很巧,因为在同一斜线上的两点的横坐标之差与纵坐标之差会相等,所以只需判断(Math.abs(col[i]-c)==(Math.abs(i-r)))是否成立

3.关键代码

importjava.util.*;

 

 

publicclassSolution {

   /**

    *

    * @param n int整型 the n

    * @return int整型

    */

   //皇后摆法得个数

   publicintans;

   publicintNqueen (intn) {

       // write code here

       ans=0;

       //记录某一列是否放了皇后

       intcol[]=newint[10];

       Arrays.fill(col,0);

       //深度搜索

       dfs(0,n,col);

       returnans;

   }

    //深度搜索

   publicvoiddfs(intr,intn,intcol[]){

       //如果搜索完棋盘的最后一行(下标从0开始最后一行是n-1)

       if(r==n){

           //摆放的方法+1

           ans++;

           return;

       }

       //遍历n列

       for(intc=0;c<n;++c){

           //剪枝操作

           if(check(r,c,col)){

               //标记在第r行的第c列放的皇后

               col[r]=c;

               //深度搜索下一行,在下一行放皇后

               dfs(r+1,n,col);

               //回溯,去除标记

               col[r]=0;

           }

       }

   }

   publicbooleancheck(intr,intc,intcol[]){

       //检查是否与前面已经放了皇后的r行是否冲突

       for(inti=0;i<r;++i){

           //检查列冲突和对角线冲突

           if(col[i]==c||(Math.abs(col[i]-c)==(Math.abs(i-r)))){

               returnfalse;

           }

       }

       returntrue;

   }

}

网络异常,图片无法展示
|

🍁每日推荐:算法面试神器:牛客网-面试神器)

如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦

相关文章
|
5月前
|
机器学习/深度学习 算法
leetcode51N皇后刷题打卡
leetcode51N皇后刷题打卡
44 0
|
5月前
每日一题(珠玑妙算,两数之和)
每日一题(珠玑妙算,两数之和)
48 1
|
11月前
|
算法
代码随想录算法训练营第四十七天 | LeetCode 198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III
代码随想录算法训练营第四十七天 | LeetCode 198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III
46 1
|
10月前
|
算法
每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题
每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题
|
算法
《蓝桥杯每日一题》二分·AcWing 1460. 我在哪?
《蓝桥杯每日一题》二分·AcWing 1460. 我在哪?
52 0
|
机器学习/深度学习
《蓝桥杯每日一题》背包dp·AcWing3382. 整数拆分
《蓝桥杯每日一题》背包dp·AcWing3382. 整数拆分
66 0
|
机器学习/深度学习 存储 算法
代码随想录训练营day48| 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
代码随想录训练营day48| 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
|
人工智能 BI
|
机器学习/深度学习 人工智能 移动开发
|
机器学习/深度学习 人工智能 移动开发