当前位置:网站首页>51.N皇后(回溯法)
51.N皇后(回溯法)
2022-07-30 05:38:00 【Linke66】


解题思路:
回溯法
主函数
初始化一个全为’.'的二维数组,哪个位置可以放置皇后棋子,修改为’Q’即可。
axis数组用来存放已经放置棋子的坐标。
//主函数
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>>ans;
vector<string>board(n,string(n,'.'));
vector<vector<int>>axis;
backtracking(ans,board,axis,0,n);
return ans;
}
辅助函数
判断[x,y]这个是否可以放置皇后棋子
bool canPutQ(vector<vector<int>>&axis,int x,int y){
for(auto& v:axis){
int _x=v[0],_y=v[1];
int d1=abs(x-_x),d2=abs(y-_y);
if(d1==0||d2==0||d1==d2) return false;
}
return true;
}
递归函数
进入递归
终止条件,行号=n
当本行有位置可以放置棋子,就进入下一行的搜索,注意要回该当前节点的状态。
void backtracking(vector<vector<string>> &ans,
vector<string> &board,
vector<vector<int>>&axis,
int row,int n)
{
if(row==n){
ans.push_back(board);
return;
}
for(int i=0;i<n;++i){
//假如不能放置棋子,进入下一次循环
if(!canPutQ(axis,row,i)){
continue;
}
//修改当前节点状态
board[row][i]='Q';
axis.push_back({
row,i});
//递归子节点
backtracking(ans,board,axis,row+1,n);
//回改当前节点状态
axis.pop_back();
board[row][i]='.';
}
}
完整代码如下
class Solution {
public:
bool canPutQ(vector<vector<int>>&axis,int x,int y){
for(auto& v:axis){
int _x=v[0],_y=v[1];
int d1=abs(x-_x),d2=abs(y-_y);
if(d1==0||d2==0||d1==d2) return false;
}
return true;
}
//主函数
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>>ans;
vector<string>board(n,string(n,'.'));
vector<vector<int>>axis;
backtracking(ans,board,axis,0,n);
return ans;
}
void backtracking(vector<vector<string>> &ans,
vector<string> &board,
vector<vector<int>>&axis,
int row,int n)
{
if(row==n){
ans.push_back(board);
return;
}
for(int i=0;i<n;++i){
//假如不能放置棋子,进入下一次循环
if(!canPutQ(axis,row,i)){
continue;
}
//修改当前节点状态
board[row][i]='Q';
axis.push_back({
row,i});
//递归子节点
backtracking(ans,board,axis,row+1,n);
//回改当前节点状态
axis.pop_back();
board[row][i]='.';
}
}
};
边栏推荐
- G Bus Count (Google Kickstart2014 Round D Problem B) (DAY 89)
- Error: npm ERR code EPERM
- MySQL的存储过程
- 相对路径和绝对路径的区别
- MySQL fuzzy query performance optimization
- cmd (command line) to operate or connect to the mysql database, and to create databases and tables
- navicat新建数据库
- 4、nerf(pytorch)
- [Mysql] DATEDIFF函数
- Detailed MySQL-Explain
猜你喜欢
随机推荐
Arrange numbers (DAY90) dfs
PyCharm使用教程(较详细,图+文)
[Koltin Flow (2)] The end operator of the Flow operator
质数(清华大学机试题)(DAY 86)
MySql fuzzy query Daquan
optimizer.zero_grad()
asyncawait和promise的区别
Detailed MySQL-Explain
“tensorflow.keras.preprocessing“ has no attribute “image_dataset_from_directory“
cnpm安装步骤
【图像处理】基于中轴变换实现图像骨架提取附matlab代码
839. 模拟堆
【Pytorch】torch.manual_seed()、torch.cuda.manual_seed() 解释
Oracle补丁体系及Opatch工具介绍
G Bus Count (Google Kickstart2014 Round D Problem B) (DAY 89)
字符串(一) 哈希
MySQL database basics (a systematic introduction)
分布式事务之 Atomikos 原理和使用(一)
numpy中np.inf函数的用法讲解
爬虫数据是如何收集和整理的?






![[详解C语言]一文带你玩转数组](/img/1b/245fdc7f3711cf794175da7a93b128.png)


