zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    radio按钮组和label标签
    div布局
    bootstrap模态框使用
    bootstrap按钮组下拉菜单使用
    Bootstrap下拉菜单和导航栏的使用
    Bootstrap源码解读下拉菜单
    python中django学习2
    windows下配置桌面github
    状态模式--无尽加班何时休
    直接在安装了redis的Linux机器上操作redis数据存储类型--set类型
  • 原文地址:https://www.cnblogs.com/Draymonder/p/7458363.html
Copyright © 2011-2022 走看看