八皇后问题 帮帮看看错在哪里??
阿仆来耶 2009-06-16 11:06:43 //八皇后问题
#include"stdio.h"
#include"stdlib.h"
#define maxsize 100
//**************************************皇后的数据结构
typedef struct
{
int i,j;//i为横坐标 j为纵坐标
}empress; //皇后的结构数组
//*****************************栈的数据结构
typedef struct
{
empress data[maxsize];
int top;
}seqstack,*pseqstack;
//**************************************************冲突判定数组
int b[7]={0,0,0,0,0,0,0}; //判断行列是否存在冲突 如果存在冲突为一,不存在冲突为零
int c[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};//判断左右斜行是否存在冲突 如果存在冲突为一,不存在冲突为零
int d[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};//判断右左斜行是否存在冲突 如果存在冲突为一,不存在冲突为零
pseqstack initseqstack()
{
pseqstack s;
s=(pseqstack)malloc(sizeof(seqstack));
if(s)
s->top=-1;
return s;
}
//*******************判断(i,j)位置是否能够放入皇后,如果函数值为1,则能够放入皇后;如果函数值为0,则不能够放入皇后
int vajus(int i,int j)
{
int m,n,q;
m=j;
n=j-i+7;
q=i+j;
if((b[m]==0)&&(c[n]==0)&&(d[q]==0))
return 1;
else return 0;
}
//*********************************判断栈是否为空,如果为空则输出1;否之输出0
int emptyseqstack(pseqstack s)
{
if(s->top==-1)
return 1;
else return 0;
}
//****************************将皇后入栈并做好了避免冲突的标记
int pushseqstack(pseqstack s,empress virempress)
{
if(s->top==maxsize-1)
{
printf("stack is full!\n");
return 0;
}
else
{
s->top++;
s->data[s->top]=virempress;
b[virempress.j]=1;c[virempress.j-virempress.i+7]=1;d[virempress.j+virempress.i]=1;
return 1;
}
}
//************************************皇后出栈,并使作为冲突的标志解除
int popseqstack(pseqstack s,empress *virempress)
{
if(emptyseqstack(s))
{
printf("stack is empty!\n");
return 0;
}
else
{
*virempress=s->data[s->top];
s->top--;
b[(*virempress).j]=0;c[(*virempress).j-(*virempress).i+7]=0;d[(*virempress).j+(*virempress).i]=0;
return 1;
}
}
//************察看栈顶元素
int seeseqstack(pseqstack s,int *i)
{
if(emptyseqstack(s))
{
printf("stack is empty!\n");
return 0;
}
else
{
*i=s->data[s->top].i;
return 1;
}
}
//********************************************打印出皇后在8*8方阵上的位置
int print(pseqstack s)
{
int current[10];
int j=0,i=s->top;
while(i>0)
{
current[j]=(s->data[i]).j;
j++;i--;
}
for(i=0;i<j;i++)
printf(" %d",current[i]);
printf("\n");
return 1;
}
void main()
{
int m,i,j,flag1=0,count,flag2=0;
empress virempress;
pseqstack s;
s=initseqstack();
for(m=0;m<8;m++)
{
virempress.i=0;
virempress.j=m;
pushseqstack(s,virempress);
while(!emptyseqstack(s))
{
flag2=0;
seeseqstack(s,&count);
if(count==7)
{print(s);popseqstack(s,&virempress);popseqstack(s,&virempress);flag1=1;}
else
{
if(flag1==0)
{i=virempress.i+1;j=0;}
if(flag1==1)
{i=virempress.i;j=virempress.j+1;}
do{
if(vajus(i,j))
{
virempress.i=i;virempress.j=j;pushseqstack(s,virempress);flag1=0;flag2=1;
}
j++;
}while(j<8&&flag2==0);
if(j==8)
{flag1=1;popseqstack(s,&virempress);}
}
}
}
}