用栈操作实现八皇后

C语言用栈操作实现八皇后

#include<stdio.h>
#include<stdlib.h>

typedef int Status;
typedef struct{
 int *base;//基址,在栈构造之前和销毁之后,base的值为NULL 
 int *top;//栈顶指针 
 int stacksize;//当前已分配的存储空间,以元素为单位 
}SqStack;
Status InitStack(SqStack &S,int n);//初始化栈 
Status Push(SqStack &S,int e);//入栈 
Status Pop(SqStack &S);//弹栈 
bool available(SqStack S,int count,int col);//判断能否放置皇后 
int queen(SqStack &S,int n);//返回皇后解法数  

int main()
{
 SqStack S;
  int num=8,count=0; //num为皇后数 ,count为解法数 
  if(num>=4)
 {
  InitStack(S,num);
  count=queen(S,num);
  printf("total conditions are %d ",count);
 } 
 else     {printf("无解");}
  return 1;
}
 
Status InitStack(SqStack &S,int n)
{
 S.base=(int *)malloc((n)*sizeof(int));
 if(!S.base) exit(-2); //存储分配失败 
 S.top=S.base;
 S.stacksize=n;
 return true;
} 

Status Push(SqStack &S,int e)
{
 *S.top++=e;
 return true;
}

Status Pop(SqStack &S)
{
 --S.top;
 return true;
}

bool available(SqStack S,int row,int col)
{
 for(int i=1;i<=row;i++)
 {
  if(col == *(S.base+i-1))   return false;//在同一行,无法放置 
  if((col-*(S.base+i-1)) == (row+1-i))   return false;//在同一副对角线,无法放置 
  if((col-*(S.base+i-1)) + (row+1-i) == 0) return false;//在同一主对角线,无法放置  
 }
 return true;
}
int queen(SqStack &S,int n)
{
  int i,judge,count = 0,row = 0,col_1,col[n+1] = {1};
  for(i=1;i<=n;i++) col[i] = 1;
 while(1)
 {   
  if(row == 0 && col[row] == n+1)break;
  if(col[row]>n)   //列数超过上限,置0,弹栈 
   {
   Pop(S);
   col[row] = 1;
   row--;
   continue;  
  } 
  if(available(S,row,col[row]))  //判断能否放置皇后 
   {
   Push(S,col[row]);
   col[row]++;      //记录下一列的位置 
   row++;       //此行入栈后继续对下一行操作 
  }
  else{        //当前列无法放置皇后 
   col[row]++;      //换下一列 
  }
  if(S.top-S.base >= S.stacksize)  //栈满,表示一种解法
   {
   count++;
   Pop(S);
   row--;
  }
 }
 return count;  //返回解法数 
} 
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页