#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#define min 10 //表示顺序栈的初始大小
#define max 5 //当初始大小不满足时,每一次的增量
#define N 8
int queennumber=0;
int queen[N][N];
struct queens{
int x;
int y;
};
typedef struct{
queens *base; //指向栈底
queens *top;
int stacksize; //栈的大小
}sqstack;
int initstack(sqstack &s){ //构建一个空栈
s.base=(queens *)malloc(min*sizeof(queens));
if(!s.base)
{cout<<"分配失败";return 0;}
s.top=s.base;
s.stacksize=min;
return 1;
}
int gettop(sqstack s,int &e, int &ee){ //返回栈顶元素
if(s.base==s.top)
return 0;
e=((s.top-1)->x);
ee=((s.top-1)->y);
return 1;
}
int push(sqstack &s,int e,int ee){ //从栈顶插入一个元素
if(s.top-s.base>=s.stacksize)
{s.base=(queens *)realloc(s.base,(s.stacksize+max)*sizeof(queens));
if(!s.base)
return 0;
s.top=s.base+s.stacksize;
s.stacksize+=max;
}
(s.top->x)=e;
(s.top->y)=ee;
s.top++;
return 1;
}
int pop(sqstack &s,int &e,int &ee){ //从栈顶删除一个元素
if(s.top==s.base)
return 0;
s.top--;
e=(s.top->x);
ee=(s.top->y);
return 1;}
void createqueen(){ //创建数组
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
queen[i][j]=0;
}
void printqueen(){ //输出数组
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
cout<<queen[i][j];
}
cout<<endl;
}
cout<<endl;
getchar();
}
bool checkqueen(int x,int y){
for(int i=1;x-i>=0;i++)
if(queen[x-i][y]==1)
return false;
i=1;
while(x-i>=0&&y-i>=0){
if(queen[x-i][y-i]==1)
return false;
i++;
}
i=1;
while(x-i>=0&&y+i<N)
{if(queen[x-i][y+i]==1)
return false;
i++;}
return true;
}
void movequeen(sqstack &s){
int line=1;
int i=0;
int count=1;
int abc;
bool is=false;
for(;i<N;i++){
abc: is=checkqueen(line,i);
if(is==true){
queen[line][i]=1;
push(s,line,i);
// printqueen();
count++;
if(count==N)
{printqueen();
queennumber++;
pop(s,line,i);
queen[line][i]=0;
count=count-1;
if(i==N-1)
{pop(s,line,i);count--;queen[line][i]=0;}
i=i+1;
goto abc;
}
line++;
i=0;
goto abc;
}
if(i==N-1&&queen[line][i]==0){
pop(s,line,i);
count--;
if(s.base==s.top)
return;
queen[line][i]=0;
// printqueen();
if(i==N-1)
{pop(s,line,i);count--;
queen[line][i]=0;
if(s.base==s.top)
return;}
i=i+1;
goto abc;
}
}
}
void main(){
sqstack s;
initstack(s);
for(int j=0;j<N;j++){
createqueen();
queen[0][j]=1;
push(s,0,j);
movequeen(s);
}
cout<<endl<<queennumber;
}