dfs经典n皇后:
思路:
Sel[i]第i行的横坐标,y本行的横坐标,x:本行的纵坐标,i:第n行
- 一行,一行的放元素,dfs接受行数(h),如果h>n,则开始走下一条路
- 核心是找横坐标(y),因为纵坐标已经确定,横坐标要满足:不与第i行在同一列(sel[i]!=y),不于第i处于同一对角线(abs(y-sel[i])==abs(x-i))
- 如果不满足,先跳出子循环(break),再continue父循环
#include<bits/stdc++.h> using namespace std; long long sel[100]; long long n,sum; long long ans[100]; void dfs(long long h) { if(h>n) { sum++; return;//判断完一次后回到上一层 } int x=h,y,i; for(y=1;y<=n;y++) { for(i=1;i<x;i++) { if(sel[i]==y) break; } if(i<x) continue; for(i=1;i<x;i++) { //对角线,abs(第i行的横坐标-本行的横坐标) ==abs(第i行的纵坐标-本行的纵坐标) if(abs(y-sel[i])==abs(x-i)) break; } if(i<x) continue; sel[i]=y;//目的!!!这才是目的!!!找到横坐标放进sel,没有这个其他的都白干 dfs(h+1);//!!!递归是dfs思想的核心!! //return; // 不需要记住当前状态,只是找数量,不需要回溯 } } int main() { for(n=1;n<=10;n++) { sum=0; dfs(1); ans[n]=sum; } while(cin>>n) { if(n==0) break; cout<<ans[n]<<endl;; } }
八皇后:
P1219 [USACO1.5]八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h> using namespace std; long long a[101],b[101],c[101],d[101]; long long n,sum; void dfs(long long h) { if(h>n) { sum++; if(sum<=3) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } return; } int x=h,y,i; for(y=1;y<=n;y++) { if(b[y]==0&&c[x+y]==0&&d[x-y+n]==0) { a[x]=y; b[y]=1; c[x+y]=1; d[x-y+n]=1; dfs(h+1); b[y]=0; c[x+y]=0; d[x-y+n]=0; } } } int main() { sum=0; cin>>n; dfs(1); cout<<sum<<endl; return 0; }
简单的对以前在word中的算法笔记进行整理,自用,参考标注不完整,侵删

浙公网安备 33010602011771号