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