• luogu p1219 八皇后


    https://www.luogu.org/problem/show?pid=1219

    经典问题,搜索一遍过。

    重点是判断皇后能否在map[x][y]放下的条件

      因为是dfs的时候过程中 x 是递增的  所以不需要 判断x轴了 

    • 判断Y轴:开一个数组y[20]  若皇后在map[x][y]放下就 y[y]=1,在拿走皇后时就 y[y]=0

    • 判断y=x方向:开一个数组xy[40],若皇后在map[x][y]放下就pxy[y-x+n]=1,,在拿走皇后时就pxy[y-x+n]=0+n 是为了防止数组越界

    • 判断y=-x方向:开一个数组_xy[40],若皇后在map[x][y]放下就pxy[y+x]=1,,在拿走皇后时就pxy[y+x]=0
    • 说实话,就是利用线性函数 来判断,我还想的是 要通过染色来判断...我那样会T的吧

    然后就是判断数量的时候  是到最后 判断 deep 》 n  直接加就行了  或者   if(dfs (deep+1)) sum++;  

    总之 DFS 和 BFS 还有差距呢  要加强自己的水平,就好了

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int sum ,ans;
    int x[20],y[20],xy[40],_xy[40];//记录x,y,y=x y=-x上面的东西
    int dp[20];
    
    int dfs(int deep)
    {
        if(deep > n)
        {
            sum++;
            if(ans < 3)
            {
                ans ++ ;
                for(int i=1;i<=n;i++)
                    cout<<dp[i]<<" ";
                cout<<endl;
            }
            return 1;
        }
        for(int i=1;i<=n;i++)
        {
            if(y[i] || xy[i-deep + n] || _xy[i+deep] )//判断y y=x y=-x方向
                continue;
            y[i] = xy[i-deep + n] =_xy[i+deep] = 1;
            dp[deep] = i;
            dfs(deep + 1);
            y[i] = xy[i-deep + n] =_xy[i+deep] = 0;
        }
    }
    
    int main ()
    {
        cin >> n;
        dfs(1);//从第一行开始准备
        cout<< sum << endl;
    }
  • 相关阅读:
    vxlan简介1
    什么underlay网络?
    CDN:内容分发网络
    zz博通发布用于数据中心交换机的开源软件开发套件SDKLT
    DPDK盒子使用手册——DPDK入门zz
    2018年最值得关注的15大技术趋势zz
    为什么要使用叶脊(leaf-spine)拓扑网络zz
    openvswitch
    Linux基础训练题型(下)
    Linux基础命令训练题型(上)
  • 原文地址:https://www.cnblogs.com/Draymonder/p/7458363.html
Copyright © 2020-2023  润新知