八皇后顺序栈实现

#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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值