一:题目 Come 宝!!!!!!!!!!!!
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法
输入格式:
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;
输出格式:
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量
输入样例:
在这里给出一组输入。例如:
1
8
5
结尾无空行
输出样例:
在这里给出相应的输出。例如:
1
92
10
二:关于输入
这里只要输入一个值有一个结果即可,嗯嗯就是这样的
三:思路
思路:
1.这里在选择建树(也就是在选择解的空间上)是 子集树
2.那么在结点上我们选择的是一个二维的矩阵就是将最后的结果落实到一个二维容器里
也就遍历到叶节点时候一种可行解的情况
3.写码思路:
<1>:递归函数的参数:
backtacking(int row,vector &v,int n)
row:代表矩阵的行数
vector &v:存放的是最后二维矩阵的可行解
n:代表的是棋盘的宽度和长度
<2>:输出结果
这里使用 vector<vector> v;
来处理每次的可行接
<3>:单层循环
这里横向每层的循环是遍历不同的列,横向的是递归二维矩阵不同的行(往下进行)
<4>:递归终止条件
当 row == n 时候,我们就可以将一次可行解装入容器了
4.这里还需补充的是在递归函数里,我们在每次选择皇后的位置的时候要注意题目的要求
不同行,不同列 不在同一条斜线上
不同行:因为我们是逐层往下递归的所以不同行我们就解决了
不同列:这里看代码
不在一条斜线上:(分为45° 和 135°) 这里图解
四:上码
/**思路:1.这里在选择建树(也就是在选择解的空间上)是 子集树2.那么在结点上我们选择的是一个二维的矩阵就是将最后的结果落实到一个二维容器里也就遍历到叶节点时候一种可行解的情况3.写码思路:1>:递归函数的参数:backtacking(int row,vector<string> &v,int n)row:代表矩阵的行数vector<string> &v:存放的是最后二维矩阵的可行解n:代表的是棋盘的宽度和长度2>:输出结果这里使用 vector<vector<string >> v;来处理每次的可行接3>:单层循环这里横向每层的循环是遍历不同的列,横向的是递归二维矩阵不同的行(往下进行)4>:递归终止条件当 row == n 时候,我们就可以将一次可行解装入容器了4.这里还需补充的是在递归函数里,我们在每次选择皇后的位置的时候要注意题目的要求不同行,不同列 不在同一条斜线上不同行:因为我们是逐层往下递归的所以不同行我们就解决了不同列:这里看代码不在一条斜线上:(分为45° 和 135°) 这里图解 **/#include<bits/stdc++.h>
using namespace std;vector<vector<string> > ans;//判断位置是否合法
bool isLegal(int row,int cal,vector<string> &v,int n){//判断是否在一列上for (int i = 0; i < row; i++) {//这里我们只判断从row往上的行即可if (v[i][cal] == 'Q') return false;}//判断是否在135°斜线上上for (int i = row - 1, j = cal - 1; i >= 0 && j >= 0; i--,j--) {if (v[i][j] == 'Q') return false;}//判断是否在45°斜线上for (int i = row - 1,j = cal + 1; i >= 0 && j <= n; i--,j++){if (v[i][j] == 'Q') return false;}return true; }void backtacking(int row,vector<string> &v,int n) {if (row == n) {ans.push_back(v);return;}for (int cal = 0; cal < n; cal++) {//cal:列if (isLegal(row,cal,v,n)) {v[row][cal] = 'Q';//这是满足条件的backtacking(row+1,v,n);v[row][cal] = '.';//当一次可行结果 结束后,需要v将空间腾出来,给后面的可行解 }}
}void solveNQueens(int n) {vector<string>v (n,string(n,'.'));//这传入的就是默认的二维矩阵..backtacking(0,v,n);// return ans;}int main(){int N;cin >> N;solveNQueens(N);cout << ans.size();}
五:贴心杰来补充了
1:码中 ‘Q’
宝 如果这道题有些地方看不懂比如题目中输入的 Q 什么的,那是我先AC的leedcode上的一道题,做出来那道后,我就直接改了改,就拿来了,如果实在看不懂可以看看下面 这个题解,也是N皇后问题
leedcodeN皇后
2:码中还有一个是vector path (n,string(n,’.’))
vector path (n,string(n,’.’)):中(n,string(n,’.’))这部分就是一个初始化
用这个容器的时候 你可能不太懂,其实那就是 一个 二维数组,用来存每次的可行解的,你想想宝 ,我们每次的结果都是在二维矩阵中的一些位置,所以我们肯定需要一个二维的容器来记录啊!!
得亏我是宠粉杰啊,直接上示例,
#include<bits/stdc++.h>
using namespace std;int main(){vector<string> v(5,string(5,'.'));for(int i = 0; i < 5; i++){for(int j = 0; j < 5; j++){cout << v[i][j] << ' ';}cout << endl;}}
加油 宝!!!