当前位置:网站首页>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]='.';
}
}
};
边栏推荐
- JVM之GC 调优基础知识(一)
- 如何使用FirewallD限制网络访问
- Summary of SQL classic interview questions in 2022 (with analysis)
- MySql的初识感悟,以及sql语句中的DDL和DML和DQL的基本语法
- Memories · The last system design in the university era
- numpy中np.inf函数的用法讲解
- Error: listen EADDRINUSE: address already in use 127.0.0.1:3000
- MySQL 灵魂 16 问,你能撑到第几问?
- MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)
- Graphic mirror symmetry (schematic diagram)
猜你喜欢

flask的笔记

cnpm installation steps

How is crawler data collected and organized?

Teach you how to design a CSDN system

MySQL 灵魂 16 问,你能撑到第几问?

Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案

Thymeleaf简介

pytorch中的线性代数

Learn FPGA from the underlying structure (6) ---- Distributed RAM (DRAM, Distributed RAM)

每日练习------输出一个整数的二进制数、八进制数、十六进制数。
随机推荐
"Hou Lang" programmer version, a speech dedicated to a new generation of programmers, He Bing's "Hou Lang" speech imitation show
配环境 / 初步测试
mysql time field is set to current time by default
mysql 中 in 的用法
G巴士计数(Google Kickstart2014 Round D Problem B)(DAY 89)
机器学习—梯度下降Gradient Descent Optimization—c语言实现
MySQL fuzzy query performance optimization
Frobenius norm(Frobenius 范数)
np.where()用法
MySql模糊查询大全
MySQL的 DDL和DML和DQL的基本语法
Prime numbers (Tsinghua University computer test questions) (DAY 86)
What is SOA (Service Oriented Architecture)?
numpy中np.inf函数的用法讲解
MySQL Soul 16 Questions, how many questions can you last?
JVM之GC 调优基础知识(一)
Graphic mirror symmetry (schematic diagram)
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)
应用实践 | Apache Doris 在百度智能云计费账单系统的应用实践