N皇后问题,只是N=13这个数据比较难过,使用了网上一种比较巧妙的位运算方法 #include<iostream> #include<fstream> #include<string> #include<memory.h> #include<cstdio> #include<cmath> #include<queue> #include<vector> using namespace std; ifstream fin("checker.in"); ofstream fout("checker.out"); int n,maxres; unsigned int res; int a[15],sum; int ps(int a) //不用 log 节省时间 { switch (a) { case 1: return 1; case 2: return 2; case 4: return 3; case 8: return 4; case 16: return 5; case 32: return 6; case 64: return 7; case 128: return 8; case 256: return 9; case 512: return 10; case 1024: return 11; case 2048: return 12; case 4096: return 13; } } void solve(unsigned int row,unsigned int ld,unsigned int rd,int dep){ int pos,p; if(row!=res){ pos=res&(~(row|ld|rd)); while(pos!=0){ p=pos&(~pos+1); pos=pos-p; if(sum<3)a[dep]=p; solve(row+p,(ld+p)>>1,(rd+p)<<1,dep+1); } } else{ if(sum<3){ for(int i=0;i<n-1;i++){ fout<<ps(a[i])<<" "; } fout<<ps(a[n-1])<<endl; } sum++; } } int main(){ fin>>n; res=(1<<n)-1; sum=0; solve(0,0,0,0); fout<<sum<<endl; return 0; }