⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8皇后问题.c

📁 此程序乃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 + -