cpp文件里的
/****************************/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define QueenNumber 8
#include"Queen.h"
void main(void)
{
int a[QueenNumber][QueenNumber];
int flag; //用来标记是否成功找到皇后的位置,成功进栈为1,出栈为0
int j,i;
int ii,iii;
int x,y;
int temp_i=0,temp_j=1;//,temp=-1;
int n=0,num;
QueenType *head;
//初始化皇后的链栈
QueenStackInitiate(&head);
//给数组a[j][i]赋值
for(j=0;j<QueenNumber;j++)
{
for(i=0;i<QueenNumber;i++)
{
a[j][i]=0;
}
}
for(ii=0;ii<QueenNumber;ii++)
{
if(QueenStackPush(head,0,ii))
{
//printf("(第0行第%d列元素)\n进栈成功\n",ii);
}
else
{
//printf("进栈失败\n");
return;
}
a[0][ii]=1;
flag=1;
loop1:
for(j=temp_j;j<QueenNumber;j++)
{
for(i=temp_i;i<QueenNumber;i++)
{
if(QueenIsHere(head,j,i))
{
//printf("成功找到位置:x=%d,y=%d\n",j,i);
if(QueenStackPush(head,j,i))
{
// printf("进栈成功\n");
a[j][i]=1;
}
else
{
//printf("进栈失败\n");
return;
}
//a[j][i]=1;
}
}
StackSee(head); //用于检测
for(iii=0;iii<QueenNumber;iii++)
{
if(a[j][iii]!=0)
{
flag=1;
iii=QueenNumber;
}
else
flag=0;
}
if(flag==0)
{
if(QueenStackPop(head,&x,&y))
{
//printf("出栈成功:x=%d,y=%d\n",x,y);
}
else
{
//printf("出栈失败\n");
return;
}
a[x][y]=0;
if(x==1&&y==7)//此处保险作用,可要可不要
{
temp_i=0;
goto loop2;
}
temp_j=x;
temp_i=y+1;
goto loop1;
}
else
{
temp_i=0;
}
}
See(a,++n);
printf("根据皇后1变化输入行号(第1,第2'''第7),进入该行循环;\n输入0进入第0行循环\n");
printf("或每次只输入7,即可得所有的皇后位置\n");
scanf("%d",&num);
//num=7;
if(num!=0)
{
find(head,&temp_j,&temp_i,num,a);
goto loop1;
}
loop2:
//temp++;
//a[0][temp]=0;
while(head->next!=NULL)
{
if(QueenStackPop(head,&x,&y))
{
//printf("出栈,清空x=%d;y=%d\n",x,y);
}
}
for(j=0;j<QueenNumber;j++)
{
for(i=0;i<QueenNumber;i++)
{
a[j][i]=0;
}
}
temp_j=1;
}
}
/**************************/
.h文件里的
/******************************/
typedef struct queen
{
int row;
int col;
struct queen * next;
}QueenType;
//初始化皇后的链栈
void QueenStackInitiate(QueenType **head)
{
if((*head=(QueenType *)malloc(sizeof(QueenType)))==NULL)
exit(1);
else
(*head)->next=NULL;
}
//入栈,成功,返回1;失败,返回0。
int QueenStackPush(QueenType *head,int x,int y)//x代表行,y代表列
{
QueenType *p;
if((p=(QueenType *)malloc(sizeof(QueenType)))==NULL)
{
//printf("内存不够,无法产生新结点,进行插入\n");
return 0;
}
else
{
p->row=x;
p->col=y;
p->next=head->next;
head->next=p;
return 1;
}
}
//出栈,成功,返回1;失败,返回0。
int QueenStackPop(QueenType *head,int *x,int *y)//x代表行,y代表列
{
QueenType *p=head->next;
if(p==NULL)
{
//printf("堆栈已空,出错\n");
return 0;
}
else
{
head->next=p->next;
*x=p->row;
*y=p->col;
free(p);
return 1;
}
}
//判断堆栈是否空,空返回0;非空返回1。
int QueenStackEmpty(QueenType *head)
{
if(head->next==NULL)
return 0;
else
return 1;
}
//取栈顶数据元素x,y;成功,返回1;失败,返回0。
int QueenStackTop(QueenType *head,int *xx_temp,int *yy_temp)
{
QueenType *p=head->next;
if(p==NULL)
{
//printf("堆栈已空,出错\n");
return 0;
}
else
{
*xx_temp=p->row;
*yy_temp=p->col;
return 1;
}
}
//取栈顶数据行元素x;成功,返回1;失败,返回0。
int QueenStackTopRow(QueenType *head,int *x)
{
QueenType *p=head->next;
if(p==NULL)
{
//printf("堆栈已空,出错\n");
return 0;
}
else
{
*x=p->row;
return 1;
}
}
//取栈顶数据列元素y;成功,返回1;失败,返回0。
int QueenStackTopCol(QueenType *head,int *y)
{
QueenType *p=head->next;
if(p==NULL)
{
//printf("堆栈已空,出错\n");
return 0;
}
else
{
*y=p->col;
return 1;
}
}
//撤销动态申请空间
void QueenDestory(QueenType *head)
{
QueenType *p,*pTemp;
p=head;
while(p!=NULL)
{
pTemp=p;
p=p->next;
free(pTemp);
}
}
//----------------------------------------------------------------
//判断第i列位置有无皇后,有返回1,无返回0;
int QueenIsCol(QueenType *head,int i)
{
QueenType *p=head->next;
while(p!=NULL)
{
if(p->col==i)
{
//printf("有列位置上的值:y=%d\n",p->col);
return 1;
}
else
p=p->next;
}
return 0;
}
//判断第j行位置有无皇后,有返回1,无返回0;
int QueenIsRow(QueenType *head,int j)
{
QueenType *p=head->next;
while(p!=NULL)
{
if(p->row==j)
{
//printf("有行位置上的值:x=%d\n",p->row);
return 1;
}
else
p=p->next;
}
return 0;
}
//判断正斜位置有无皇后,有返回1,无返回0;
int QueenIsSkew(QueenType *head,int j,int i)
{
QueenType *p=head->next;
for(--j,++i;j>=0&&i<QueenNumber;--j,++i)//逐个给出正斜上的值
{
while(p!=NULL)
{
if(p->row==j&&p->col==i) //判断堆栈中有无正斜上的值
{
//printf("有正斜上的值:x=%d,y=%d\n",p->row,p->col);
return 1;
}
else
p=p->next;
}
p=head->next;
}
return 0;
}
//判断反斜位置有无皇后,有返回1,无返回0;
int QueenIsUnskew(QueenType *head,int j,int i)
{
QueenType *p=head->next; //逐个给出反斜上的值
for(--j,--i;j>=0&&i>=0;--j,--i)
{
while(p!=NULL)
{
if(p->row==j&&p->col==i)//判断堆栈中有无反斜上的值
{
//printf("有反斜上的值:x=%d,y=%d\n",p->row,p->col);
return 1;
}
else
p=p->next;
}
p=head->next;
}
return 0;
}
//判断皇后是否可以在这个位置,可以返回1,不可以返回0
int QueenIsHere(QueenType *head,int j,int i)
{
if(QueenIsCol(head,i)==1)
return 0;
else if(QueenIsRow(head,j)==1)
return 0;
else if(QueenIsSkew(head,j,i)==1)
return 0;
else if(QueenIsUnskew(head,j,i)==1)
return 0;
else
return 1;
}
//显示
void See(int a_temp[QueenNumber][QueenNumber],int n)
{
printf("第%d种方法\n",n);
for(int j=0;j<QueenNumber;j++)
{//printf("显示\n");
for(int i=0;i<QueenNumber;i++)
printf("%d ",a_temp[j][i]);
printf("\n");
}
}
//
void find(QueenType *head,int *Ftemp_j,int *Ftemp_i,int F_n,int temp_a[QueenNumber][QueenNumber])
{
int F_x,F_y;
while(head->next->row >=F_n)
if(QueenStackPop(head,&F_x,&F_y))
{
temp_a[F_x][F_y]=0;
//printf("find出栈成功\n");
}
*Ftemp_j=F_x;
*Ftemp_i=F_y+1;
}
//看链栈的数据元素
void StackSee(QueenType *head)
{
QueenType *p;
p=head->next;
while(p!=NULL)
{
printf("r=%d,c=%d; ",p->row,p->col);
p=p->next;
}
printf("\n");
}
///////////////////不可以//////////////////