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; //返回解法数
}