当前位置: 首页 > news >正文

51. N-Queens

目录

题目描述

方法一、回溯+每次判断是否合法

方法二、回溯+哈希

方法三、回溯+位运算


题目描述

51. N-Queens

方法一、回溯+每次判断是否合法

class Solution {vector<vector<string>> res;vector<string> chessboard;
public:vector<vector<string>> solveNQueens(int n) {chessboard.resize(n,string(n,'.'));backtrack(n,0);return res;}void backtrack(int n,int row){if(row == n){res.push_back(chessboard);return;}for(int col = 0;col < n;col++){if(valid(row,col,n)){chessboard[row][col] = 'Q';backtrack(n,row+1);chessboard[row][col] = '.';}}}bool valid(int row,int col,int n){for(int i = row-1;i>=0;i--){if(chessboard[i][col] == 'Q')return false;}for(int i = row-1,j = col-1;i>=0&&j>=0;i--,j--){if(chessboard[i][j] == 'Q')return false;}for(int i = row-1,j = col+1;i>=0&&j<n;i--,j++){if(chessboard[i][j] == 'Q')return false;}return true;}
};

方法二、回溯+哈希

记录棋盘上已经处于攻击范围的直线,将判断能否摆放新皇后的时间复杂度降为O(1)。

class Solution {vector<vector<string>> res;vector<string> chessboard;vector<bool> columns;vector<bool> diagonals1;vector<bool> diagonals2;
public:vector<vector<string>> solveNQueens(int n) {chessboard.resize(n,string(n,'.'));columns.resize(n,false);//分别有2n-1条正斜线和反斜线diagonals1.resize(2*n-1,false);diagonals2.resize(2*n-1,false);backtrack(n,0);return res;}void backtrack(int n,int row){if(row == n){res.push_back(chessboard);return;}for(int col = 0;col < n;col++){if(columns[col])continue;int diag1 = row+col;if(diagonals1[diag1])continue;int diag2 = row-col+(n-1);if(diagonals2[diag2])continue;columns[col] = true;diagonals1[diag1] = true;diagonals2[diag2] = true;chessboard[row][col] = 'Q';backtrack(n,row+1);chessboard[row][col] = '.';columns[col] = false;diagonals1[diag1] = false;diagonals2[diag2] = false;}}
};

方法三、回溯+位运算

方法二中的哈希表可以改用位运算,节省空间开销。

class Solution {vector<vector<string>> res;vector<string> chessboard;int columns;   //第i个比特位为0表示第i列能放,为1表示不能放int diagonals1;//第i个比特位为0表示第i条反斜线能放,为1表示不能放int diagonals2;//正斜线的情况
public:vector<vector<string>> solveNQueens(int n) {chessboard.resize(n,string(n,'.'));columns = 0;//分别有2n-1条正斜线和反斜线,题目保证n<=9,那么2n-1<=17,int类型一共有32个比特位够用diagonals1 = 0;diagonals2 = 0;backtrack(n,0);return res;}void backtrack(int n,int row){if(row == n){res.push_back(chessboard);return;}for(int col = 0;col < n;col++){if(columns &(1<<col))continue;int diag1 = row+col;if(diagonals1 &(1<<diag1))continue;int diag2 = row-col+(n-1);if(diagonals2 &(1<<diag2))continue;columns    |= (1<< col);diagonals1 |= (1<< diag1);diagonals2 |= (1<< diag2);chessboard[row][col] = 'Q';backtrack(n,row+1);chessboard[row][col] = '.';columns    &= (~(1<< col));diagonals1 &= (~(1<<diag1));diagonals2 &= (~(1<<diag2));}}
};
http://www.xdnf.cn/news/728911.html

相关文章:

  • 【学习笔记】深度学习-梯度概念
  • leetcode669.修剪二叉搜索树:递归法利用有序性精准剪枝
  • 三格电子——RS232/485/422转光纤的应用
  • Ubuntu 18.04 上源码安装 protobuf 3.7.0
  • 代购企业如何解决选品管理问题?
  • 历年上海交通大学计算机保研上机真题
  • Hive数据倾斜问题深度解析与实战优化指南
  • 宇树机器狗go2—slam建图(2)gmapping
  • 历年西安交通大学计算机保研上机真题
  • 小程序跳转H5或者其他小程序
  • KubeMQ 深度实践:构建可扩展的 LLM 中台架构
  • 使用FastAPI+Sqlalchemy从一个数据库向另一个数据库更新数据(sql语句版)
  • 在线政治采购系统架构构建指南
  • 【设计模式】责任链模式
  • Scratch节日 | 龙舟比赛 | 端午节
  • 历年南京大学计算机保研上机真题
  • 信息化项目验收测试:MES 系统验收测试的测试重点
  • 海思 35XX MIPI读取YUV422
  • USB MSC SCCI
  • 力扣HOT100之动态规划:322. 零钱兑换
  • web自动化-Selenium、Playwright、Robot Framework等自动化框架使用场景优劣对比
  • 拉普拉斯噪声
  • eBest智能价格引擎系统 助力屈臣氏饮料落地「价格大脑」+「智慧通路」数字基建​
  • 医疗IT系统绝缘监测及故障定位,绝缘监测技术在医院关键区域的应用
  • t015-预报名管理系统设计与实现 【含源码!!!】
  • 【请关注】各类数据库优化,抓大重点整改,快速优化空间mysql,Oracle,Neo4j等
  • Python打卡第40天
  • 开发效率提升小技巧:快速提取图标资源的解决方案
  • Unity 中实现首尾无限循环的 ListView
  • 设计模式之简单工厂模式