八皇后
八皇后
普通解法
#include<cstdio>
#include<iostream>
const int MAXN=20;
int l1[MAXN+MAXN],l2[MAXN+MAXN],y[MAXN],mark[MAXN];
int n=0,ans=0;
void print()
{
std::cout<<mark[1];
for(int i=2;i<=n;i++)
std::cout<<" "<<mark[i];
std::cout<<std::endl;
}
void search(int x)
{
if(x==n+1)
{
ans++;
if(ans<=3)print();
return;
}
for(int i=1;i<=n;i++)
if(!y[i]&&!l1[x+i]&&!l2[x-i+n])
{
y[i]=l1[x+i]=l2[x-i+n]=true;
mark[x]=i;
search(x+1);
y[i]=l1[x+i]=l2[x-i+n]=false;
}
}
int main()
{
std::cin>>n;
search(1);
std::cout<<ans<<std::endl;
return 0;
}
位运算
#include <iostream>
using namespace std;
const int MAXN=15;
int a[MAXN];
void printAns(int n)
{
for(int i=1;i<=n;i++)
for(int j=0;j<n;j++)
if((1<<j) & a[i])
{
cout<<j+1;
if(i!=n)cout<<" ";
break;
}
cout<<endl;
}
void dfs(int n,int x,int L,int M,int R,int& ans)
{
if(x==n+1)
{
if(++ans<=3)printAns(n);
return;
}
int D=~(L|M|R),U=1<<n;
for(int k=D&-D;D && k<U;D-=k,k=D&-D)
{
a[x]=k;
dfs(n,x+1,(L|k)<<1,M|k,(R|k)>>1,ans);
}
}
int main()
{
int n,ans=0;
cin>>n;
dfs(n,1,0,0,0,ans);
cout<<ans<<endl;
return 0;
}
现在才知道原来位运算法再往下挖就是状压