📄 8皇后问题.c
字号:
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
#define STACK_INI_SIZE 30
#define STACKINCREMENT 20
typedef struct
{
int *top;
int *base;
int stacksize;
int length;
}sqstack;
main()
{
void initstack(sqstack *s);/*初始化栈*/
void operation(sqstack *s,int i);/*运算*/
void clearstack(sqstack *s);/*清空栈*/
sqstack s;
int i,flag1=1,flag2=1,flag3=1;
char ch;
initstack(&s);
printf("请输入皇后的个数(大于3以上的皇后数)\n");
while(flag1)
{
fflush(stdin);
scanf("%d",&i);
if(i<4)
printf("输入错误请重新输入\n");
else
flag1=0;
}
flag1=1;
while(flag1)
{
clearstack(&s);
operation(&s,i);
flag2=1;
printf("\n还继续么?(y/n)");
while(flag2)
{
fflush(stdin);
scanf("%c",&ch);
if(ch=='n'||ch=='N')
{
flag1=0;
flag2=0;
}
else if(ch=='y'||ch=='Y')
{
flag1=1;
flag2=0;
}
else
printf("\n输入错误请重新输入\n");
}
if(flag1)
{
printf("请输入皇后的个数(大于3以上的皇后数)");
while(flag3)
{
fflush(stdin);
scanf("%d",&i);
if(i<4)
printf("输入错误请重新输入\n");
else
flag3=0;
}
flag3=1;
}
}
}
void initstack(sqstack *s)
{
s->top=s->base=(int *)malloc(STACK_INI_SIZE*sizeof(int));
if(!s->base)
exit(1);
s->stacksize=STACK_INI_SIZE;
*(s->base)=0;
s->top++;
*(s->top)=101;
s->top++;
s->length=2;
}
void push(sqstack *s,int i)
{
int *p;
if(s->length>=s->stacksize)
{
s->base=(int *)realloc(s->base,(STACK_INI_SIZE+STACKINCREMENT)*sizeof(int));
if(!s->base)
exit(1);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top)=i;
s->top++;
s->length++;
p=s->base;
}
int pop(sqstack *s)
{
int *p,k;
if(s->top==s->base)
exit(1);
else
{
p=s->top;
k=*(--p);
s->top--;
*(s->top)=NULL;
s->length--;
}
return(k/100);
}
void operation(sqstack *s,int i)
{
void stackoutput(sqstack *s);
int j,k,m,n,x,y,z,a,b=0,flag1=1,flag2=1,flag3=1,*p;
j=2;/*初始化从第2列*/
k=1;/*j代表当前列数的行数*/
while(s->top-1!=s->base)/*输出所有成立条件之后结束循环*/
{
flag1=1;/*旗帜*/
for(;k<=i&&flag1;k++)/*计算行数*/
{
p=s->top;
y=j;/*列*/
x=k;/*行*/
z=0;
flag2=1;
p--;
if((*(s->top-1)%100)==i)
p--;
while(p!=s->base&&flag2)
{
m=(*p)/100;/*行*/
n=(*p)%100;/*列*/
if(m==x)
flag2=0;
else if(x+y==m+n)
flag2=0;
else if(m-n==x-y)
flag2=0;
else
z++;
p--;
}
flag2=1;
if(j==1)
{
a=k*100+j;
if(k<i+1)
{
push(s,a);
k=0;
j=2;
}
else
{
s->top=s->base;
flag1=0;
}
}
else if(z==j-1)
{
a=k*100+j;
push(s,a);
if(j!=i)
{
j++;
k=0;
}
else
{
printf(" %3d.",++b);
stackoutput(s);
if(b%5==0)
printf("\n");
}
}
else if(k==i)
{
if((*(s->top-1)%100)==i)
k=pop(s);
flag3=1;
while(j!=1&&flag3)
{
k=pop(s);
j--;
if(k!=i)
flag3=0;
}
}
if(((*(s->top-1)/100)==i)&&(*(s->top-1)%100==i))
{
if((*(s->top-1)%100)==i)
k=pop(s);
flag3=1;
while(j!=1&&flag3)
{
k=pop(s);
j--;
if(k!=i)
flag3=0;
}
}
}
}
}
void clearstack(sqstack *s)
{
int *p;
p=s->top;
p--;
while(p!=s->base)
{
*p=NULL;
p--;
}
s->top=s->base;
s->top++;
*(s->top)=101;
s->top++;
s->length=2;
}
void stackoutput(sqstack *s)
{
int *p,*q;
q=p=s->top;
p--;
while(p!=s->base)
p--;
p++;
while(p!=s->top)
{
printf("%d",*p/100);
p++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -