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;
}

 

posted @ 2017-08-31 15:09  Draymonder  阅读(173)  评论(0编辑  收藏  举报