【HDU2553】n皇后
tips:
1.n皇后其实是用递归遍历所有可能的情况,通过位置的限制来减小解空间的大小,减少枚举的数目。属于递归以枚举。
2.是递归完成全排列的基础上改的。
3.有一维和剪枝的写法(待补)
4.假设到一般情况,写流程(函数)。如本题:假设当前枚举到第index行。
#include<cstdio>
#include<cmath>
#include<algorithm>
const int maxn=11;
int n,P[maxn],hashTable[maxn]={false};
int cnt=0;
int ans[maxn];
//好多分析时都是假设到n,即中间某一一般化的状态
//假设当前要确定第index行的放置位置
void generateP(int index){
if(index == n+1){
bool flag=true;
//检验i行的列和j行的列放置是否矛盾
//已经排除了同行同列的情形,只需检验对角线即可
for(int i=1;i<=n; i++){
for(int j=i+1;j<=n;j++){
if(abs(i-j)==abs(P[i]-P[j])) flag=false;//几何关系转换成下标关系
}
}
if(flag) cnt++;
return;
}
//每一层都是从1开始枚举的,上下层并不矛盾
for(int x=1;x<=n;x++){
if(hashTable[x]==false ){
P[index]=x;//index行的皇后放在x列
hashTable[x]=true;
generateP(index+1);
hashTable[x]=false;
}
}
}
int main(){
//先预处理,打出表来
for(int i=1;i<=10;i++){
n=i;
generateP(1);
ans[i]=cnt;
cnt=0;
}
//输入
while(scanf("%d",&n)!=EOF && n){
printf("%d\n",ans[n]);
}
return 0;
}
ref:
1.胡凡的算法笔记
2.博客
https://blog.csdn.net/Hackbuteer1/article/details/6657109