这里涉及到的知识是属于搜索问题,我们这里的DFS(Depth-First—Search),即深度优先搜索;
这个讨论的是图论的问题,图论的问题是关于边和点的关系
怎么考虑深度优先搜索呢,就是从起点往相邻的节点去走,边界条件是走到了目标节点后退出,搜索的方式是从一条路走到底,如果还是没有找到目标节点那就回溯往另一条路走,也就是说要把一个图能走的点都去走一遍;
缺点:这样去做深度优先搜索是十分耗时间的一种行为,因为我们是把这一条路走到底,基本上就是说,如果这个情况最差的话我们得吧这个图的所有节点都给遍历一遍,对于大的数据来讲的话是很不恰当的,时间;
优点:对于内存的消耗不高,解决了BFS过量消耗内存的行为;
核心代码:
#include<bits/stdc++.h>
using namespace std;
int n;
char arr[10][10];
int judge(int i,int j){
for(int k = 1;k<i;k++){
if(arr[k][j] == 'Q') return 1;
} //检查列
int m = i-1 , e = j-1;
while(m>=1 && e>=1){
if(arr[m--][e--] == 'Q') return 1;
}
m = i-1 , e = j+1;
while(m>=1 && e<=n){
if(arr[m--][e++] == 'Q') return 1;
}
return 0;
}
void dfs(int k){
if(k == n){
for(int i = 1;i<=n;i++){
for(int j = 1; j<=n;j++){
if(arr[i][j] != 'Q') cout<<'.';
else cout<<'Q';
}
cout<<'\n';
}
cout<<'\n'; //边界条件
}
for(int i = 1; i<=n;i++){
if(judge(k+1,i)) continue;
arr[k+1][i] = 'Q';
dfs(k+1);
arr[k+1][i] = '.';
}
return ;
}
int main()
{
cin>>n;
dfs(0);
return 0;
}