N 皇后问题

N 皇后问题

  • 分析:根据题意,用dfs求解,在一个皇后放置后,他所在的列和两个对角线都要被标记,而他所在的行在占领后就不会再被遍历,在列和对角线都没有被标记时,证明这个位置可以放置皇后,就在这个位置放置皇后然后标记他的列和对角线,递归结束的标志是n个皇后放置完毕,输出n个皇后所在的列号。
  • #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,sum=0;
    int a[51],b[51],c[51],d[51];
    void dfs(int i)
    {
        if(i==n+1)
        {
            sum++;
            for(int j=1;j<=n;j++)
             printf("%5d",a[j]);
            cout<<endl;
            return;
        }
        for(int j=1;j<=n;j++)//遍历当前这个皇后存在的列 
        {
            if(b[j]==0&&c[j+i]==0&&d[i-j+n]==0)
            {
                a[i]=j;
                b[j]=1;//占领第i列 
                c[i+j]=1;//占领对角线 左下到右上 
                d[i-j+n]=1;//占领对角线 右左上到下 
                dfs(i+1);
                b[j]=0;
                c[i+j]=0;
                d[i-j+n]=0;
            }
        }
    }
    int main()
    {
        cin>>n;
        dfs(1);
        if(sum==0) cout<<"no solute!";
        return 0;    
    }

     

posted @ 2022-08-23 15:37  4lovls  阅读(21)  评论(0)    收藏  举报