Leetcode典型题解答和分析、归纳和汇总——T51(N皇后)

news/2025/4/2 15:32:39/

题目描述:

n皇后问题研究的是如何将n个皇后放置在n*n的棋盘上,并且使皇后彼此之间不能相互攻击。

给定一个整数n,返回所有不同的N皇后问题的解决方案。

题目解析:

本题采用典型的回溯法来进行求解。本质就是暴力搜索,把所有的空间都进行遍历,从而达到找出所有可能解的目的。

为了防止皇后出现相互攻击的情况,则每一行、每一列、对角线上都只允许有一个皇后出现,而且在处理过程中,采用回溯的算法可以找出满足题目意思的所有解。

class Solution{public:void DFS(int k, int n, vector<vector<int>>& matrix, vector<vector<string>>&res, vector<string>& location){if(k==n)  //k表示现在回溯的行数,如果已经全部遍历完成,则表示找到一组解{res.push_back(location);return;}//i为当前第k行的列数for(int i=0;i<n;i++){if(matrix[k][i]==0) //0表示当前位置可以放皇后{//存储当前数组,方便回溯vector<vector<int>> before =matrix;//把当前位置置为Qlocation[k][i]='Q';//模拟棋盘数组放入皇后put_down_the_queen(k,i,matrix);//进行下一行的判断DFS(k+1,n,matrix,res,location);//回溯过程,若第k+1行的所有位置都不行,则找第k行i之后的下一个可行位置matrix = before;location[k][i]='.';}}}void put_down_the_queen(int x,int y,vector<vector<int>>& matrix){//用dx,dy的变化来表示皇后可以攻击的8个方位(左、右、上、下,左上,左下,右上,右下)static const int dx[]={-1,1,0,0,-1,-1,1,1};static const int dy[]={0,0,-1,1,-1,1,-1,1};//让皇后所在的位置置为1matrix[x][y]=1;for(int i=1;i<matrix.size()-1;i++){//j代表方向,皇后的攻击方向总共有8个for(int j=0;j<8;j++){//找到延展方向的下标int new_x=x+i*dx[j];int new_y=y+i*dy[j];//若下标在棋盘的范围之内,则将所在的位置置为1if(new_x>=0&&new_x<matrix.size()&&new_y>=0&&new_y<matrix.size()){matrix[new_x][new_y]=1;}}}}vector<vector<string>> solveNQueens(int n){vector<vector<string>> res;  //用来返回结果if(n<0)   return res;vector<string>  location; //表示中间结果vector<vector<int>> matrix;  //表示模拟棋盘数组//对matrix和location进行初始化for(int i=0;i<n;i++){string s="";vector<int> tmp;for(int j=0;j<n;j++){s.push_back('.');tmp.push_back(0);  //赋值为0}location.push_back(s);matrix.push_back(tmp);  //棋盘中的每一个元素都设置为0}//进行递归回溯DFS(0,n,matrix,res,location);return res;}
};

解法二:不需要对全局的模拟棋盘进行更改,只需要对前k行已经摆放的皇后进行攻击匹配,如果存在违反条件的情况,则进行回溯。

class Solution {
public:vector<vector<string>> res;//检查该位置是否可以放置Q,判断的时候不需要全局,只需要查看前x行即可bool check(vector<string>& temp,int x,int y,int n){int _x=x, _y=y;//向上查找while(_x>=0){if(temp[_x][_y]=='Q')return false;--_x;}_x=x;//左上查找while(_x>=0 && _y>=0){if(temp[_x][_y]=='Q')return false;--_x,--_y;}_x=x,_y=y;//右上查找while(_x>=0 && _y<n){if(temp[_x][_y]=='Q')return false;--_x,++_y;}return true;}//dfs,只有行数增加即可void helper(vector<string>& temp, int n, int x){if(x==n){res.push_back(temp);return ;}//判断该行的每列是否可以放置Qfor(int j=0;j<n;j++){if(check(temp,x,j,n)){temp[x][j]='Q';helper(temp,n,x+1);temp[x][j]='.';}}}vector<vector<string>> solveNQueens(int n) {string t;for(int i=0;i<n;i++){t+='.';}vector<string>temp(n,t);helper(temp,n,0);return res;}
};

 


http://www.ppmy.cn/news/522043.html

相关文章

关于T51的25C°电池曲线合成(MTK)

kernel-3.18/arch/arm64/boot/dts/t51_8735a_64_bsp_geleite_bat_setting.dtsi 电池曲线表一部分 填到对应数组&#xff08;-10&#xff0c;0&#xff0c;25&#xff0c;50对应数组 0 1 2 3 &#xff09; battery_profile_t2_num <100 >; (DOD->OCV) r_profile_t2…

力扣T51数组中的逆序对--困难

代码是正确的但是对于超级大的输入时还是超时了。 运用分治排序的思想 import java.util.Arrays; public class 数组中的逆序对 {public static void main(String[] args) {int[] arr {37,40,48,90,32,5,12,3,44,13}; // System.out.println(reversePairs(arr));System.out.…

剑指offer T51数组中的逆序对

case1:暴力法 class Solution {/*case1:暴力法*/public int reversePairs(int[] nums) {int len nums.length;if(len<0) return 0;int res 0;for(int i0;i<len-1;i){for(int ji1;j<len;j){if(nums[j]<nums[i]){res;}}}return res; } }case2: 思想&#xff1a…

leetcode-t51 N皇后(回溯)

51. N 皇后 难度困难569收藏分享切换为英文关注反馈 n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 给定一个整数 n&#xff0c;返回所有不同的 n 皇后问题的解决方案。 每一种解法包含…

蓝蓝算法第二期,T51

思路&#xff1a; 质数即素数&#xff0c;除了1和它本身外&#xff0c;没有其他因数&#xff0c;0,1除外。 素数的因数必定小于x.sqrt() 具体实现&#xff1a; #include <stdio.h> main(){ int n,flag1; scanf("%d",&n); for (int i2; i<sqrt(n); i)…

T51 N皇后

思想&#xff1a;跟解数独那题很像&#xff0c;同样都是先枚举每一行的情况&#xff0c;如果能枚举到第n行&#xff0c;表示有解 只不过数独是保证每一行&#xff0c;每一列&#xff0c;每一个Box中元素唯一&#xff1b; 这里的N皇后是保证每一行&#xff0c;每一列&#xff0c…

指针和数组--指针数组及其应用

目录 一、指针数组用于表示多个字符串 二、指针数组用于表示命令行参数 一、指针数组用于表示多个字符串 一维数组可存储一个字符串&#xff0c;二维数组可存储多个字符串。 二维数组的元素在内存中是连续存放的&#xff0c;存完第一行后&#xff0c;再存第二行&#xff0c;以…

中兴u31网关服务器位置,中兴LTE-U31网管简易操作指南

《中兴LTE-U31网管简易操作指南》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《中兴LTE-U31网管简易操作指南(20页珍藏版)》请在人人文库网上搜索。 1、LTE网管U31简易操作登陆网管系统概述&#xff1a;打开配置&#xff0c;单击网元管理右击SDR-OMMB-LTE&#xff0…