题目:
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例 1:

输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1 输出:[["Q"]]
提示:
1 <= n <= 9该问题为典型的回溯问题,来看看代码吧
- class Solution {
- public:
- void put_queen(int x,int y,vector
int >>&attack)//x,y分别表示传进去的行和列,attack数组表示该行皇后可以攻击到的位置 - {
- static const int dx[]={-1,1,0,0,-1,-1,1,1};
- static const int dy[]={0,0,-1,1,-1,1,-1,1};
- attack[x][y]=1;
- for(unsigned int i=1;i
size();i++){ - for(int j=0;j<8;j++){
- unsigned int nx=x+i*dx[j];
- unsigned int ny=y+i*dy[j];
- if(nx>=0&&nx
size()&&ny>=0&&nysize()){ - attack[nx][ny]=1;
- }
- }
- }
- }
- //line表示当前处理的行,n表示N皇后问题,queen数组表示皇后存储的位置,attack表示皇后攻击的位置,re表示存储N皇后的全部解法
- void backtrack(int line,int n,vector
&queen,vectorint >>&attack,vector>&re) - {
- if(line==n){
- re.push_back(queen);
- return;
- }
- for(int i=0;i
- if(attack[line][i]==0){
- vector
int>> temp=attack; - queen[line][i]='Q';
- put_queen(line,i,attack);
- backtrack(line+1,n,queen,attack,re);
- attack=temp;
- queen[line][i]='.';
- }
- }
- }
- vector
> solveNQueens(int n) { - vector
> re;//存储最终结果 - vector
int>> attack;//标记皇后攻击位置 - vector
queen;//保存皇后位置 - for(int i=0;i
- attack.push_back((std::vector<int>()));
- for(int j=0;j
push_back(0); - queen.push_back("");
- queen[i].append(n,'.');
- }
- backtrack(0,n,queen,attack,re);
- return re;
- }
- };
这里我把题目链接贴上供各位查看
-
相关阅读:
【力扣】42. 接雨水
SQL的注入对于安全测试的重要性~
ThreadLocal 详解
【 C++ 】vector的模拟实现
比特位的计算
FFT点数、补零对结果的影响
初级软件测试工程师笔试试题,你知道答案吗?
LeetCode 389. 找不同
vue+Ts+element组件封装
如何在linux系统下快速上手调试器gdb
-
原文地址:https://blog.csdn.net/qq_71416673/article/details/138096699