子集数框架
#include <stdio.h> #include <math.h> static int table[9][9]={0}; class Queen { friend int nQueen(int); private: bool Place(int k); void Backtrack(int t); int n,*x; long sum; };
bool Queen::Place(int k) { for (int j=1;j<k; j++) if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) {
return false; } return true;}
void Queen::Backtrack(int t) { if (t>n) {
sum++; printf("%d\n",sum); for(int i=1;i<9;i++) { for(int j=1;j<9;j++) printf("%2d",table[i][j]); putchar('\n'); } putchar('\n'); for(int i=2;i<9;i++) for(int j=1;j<9;j++) table[i][j]=0; } else { for (int i=1; i<=n; i++) { x[t]=i; if (Place(t)) { table[t][i]=1; Backtrack(t+1); } table[t][i]=0; } }}
int nQueen(int n) { Queen X; X.n=n; X.sum=0; int *p=new int[n+1]; for (int i=0;i<=n; i++) p[i]=0; X.x=p; X.Backtrack(1);
delete[] p; return X.sum;}
int main() { int x,y; x=8; y=nQueen(x); printf(“sum=%d\n”,y); return 0; }
