//N皇后问题,很久以前就知道,第一次写,dfs
class Solution {
bool visited[50];//如果visited[i]为true,表示第i列已经访问
int a[50];//皇后放在 ( i, a[i] )
int result=0;
public:
int totalNQueens(int n) {
memset(visited,0,sizeof(visited));
dfs(n,0);
return result;
}
bool can(int d)
{
if(visited[a[d]])return false;//判断该列是否有碰撞
for(int i=0;i<d;i++)
if(abs(a[d]-a[i])==abs(d-i))return false;//判断对角线是否有碰撞
return true;
}
void dfs(int n,int d)
{
if(d==n)
{result++;return;}
for(int i=0;i<n;i++)
{
a[d]=i;//本次,第d行的Queen放在第a[d]列
if(can(d)){
visited[i]=true;
dfs(n,d+1);//如果第d行的方法可行,就放下一行
visited[i]=false;}
}
}
};
本文介绍了一种使用深度优先搜索(DFS)解决N皇后问题的方法。通过递归地尝试每一种可能的放置方式来寻找所有可行解,并利用冲突检查提前终止无效路径,以提高效率。
234

被折叠的 条评论
为什么被折叠?



