n皇后问题(深搜dfs/回溯)

直接上代码附有解析

#include<bits/stdc++.h>
using namespace std;
struct node///坐标数组
{
    int x,y;
}Node[15];
bool visit[15]={false};
int n,ans=0;
bool check(node a,node b)///判断是否在同一对角线上
{
	int l1=abs(a.y-b.y),l2=abs(a.x-b.x);///l1,l2为一直角三角形的两条边
    if(l1==l2) return false;///若l1==l2,则说明在同一对角线上
    return true;
}
void dfs(int index)
{
    if(index>n) {ans++; return ;}///能到这里就说明满足题目要求,ans加一
    for(int i=1;i<=n;i++)
    {
        node a;a.x=index,a.y=i;///记录即将放棋子的位置
        if(visit[i]==false)///若该列没访问,可继续下面的判断
        {
            bool flag=true;///假设当前列可以放棋子
            for(int j=1;j<index;j++)///位置a与之前的位置相对比,进行检测
            {
                ///若即将落子的地方无法满足不在同一斜线上,则当前列不可以放棋子,flag=false;然后回溯
                if(check(a,Node[j])==false) {flag=false;break;}
                ///要break,不能return,因为只能说明第index行第i列不能放棋子,还要判断第i+1列能否放棋子
                ///若return,则直接返回到第index-1行了,没有判断完第index行的所有位置
            }
            ///满足check条件
            if(flag)///可以放
            {
                visit[i]=true;///访问
                Node[index].x=index,Node[index].y=i;///记录到第index层所放的所有棋子坐标
                dfs(index+1);///继续往下一层搜索
                visit[i]=false;///该层运行结束,要将棋子拿起来,回到开始时的状态
            }
        }
    }
}
int main()
{
    cin>>n;///1s内,n最大到12;
    dfs(1);
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Spidy_harker/article/details/88757454