文章目录
引入
分析
代码:
#include <iostream>
using namespace std;
const int N = 20;
int n;
char path[N][N];
bool col[N],bg[N],ubg[N];
void dfs(int u){
if(u==n){
for(int i=0;i<n;i++) puts(path[i]);
puts("");//换行
}
for(int i = 0;i<n;i++){
if(!col[i]&&!bg[i+u]&&!ubg[i-u+n]){//位置i没有被标记过
path[u][i]='Q';//放皇后
col[i]=bg[i+u]=ubg[i-u+n]=true;//将其标记为不能放皇后
dfs(u+1);//为下一个u找对应的i
col[i]=bg[i+u]=ubg[i-u+n]=false;//恢复现场
path[u][i]='.';
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
path[i][j]='.';
}
dfs(0);
}
NC39 N皇后问题
此题只需要返回解的个数即可,但是由于无法声明全局变量,要在main函数里面进行初始化,并且传参。
注意:count以及各个数组要传入指针的地址,因为会在多次调用的时候都会使用到
class Solution {
public:
/**
*
* @param n int整型 the n
* @return int整型
*/
void dfs(char** path,vector<bool> &col,vector<bool> &bg,vector<bool> &ubg,int n,int u,int &count){
if(u==n){
count++;
//for(int i=0;i<n;i++) puts(path[i]);
//puts(""); //测试输出结果是否准确
return;
}
for(int i=0;i<n;i++){
if(!col[i]&&!bg[i+u]&&!ubg[i-u+n]){//该位置没有被标记
path[u][i]='Q';
col[i]=bg[i+u]=ubg[i-u+n]=true;
dfs(path,col,bg,ubg,n,u+1,count);
col[i]=bg[i+u]=ubg[i-u+n]=false;//恢复现场
path[u][i]='.';
}
}
}
int Nqueen(int n) {
// write code here
//声明二维数组,并赋初值
char** path = new char* [n];
for(int i=0;i<n;i++){
path[i] = new char[n];
for (int j = 0; j < n; j++)
path[i][j] = '.';
}
//初始化三个bool类型的数组,用来标记各个方向位置
vector<bool> col(n,false),bg(n,false),ubg(n,false);
//记录解的个数
int count = 0;
dfs(path,col,bg,ubg,n,0,count);
return count;
}
};
复杂度
时间复杂度:O(n*n!)