八皇后

软件工程部编程小结第一期
八皇后的问题,其实是一个回溯法的典型实例,下面就是它的一种实现,纯粹出自个人的想法,但是有点问题:网上说八皇后的解法有92中,我的打印出来有88种,可能哪里错了,还望高手指正!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define EmpCount 8

typedef struct
{
int x,y;
}
DataType;

struct SeqStack
{
int MAXNUM;
int t;
DataType *s;
};

typedef struct SeqStack *PSeqStack;

//创建一个空栈
PSeqStack createEmptyStack_seq(int m)
{
PSeqStack pastack = (PSeqStack)malloc(sizeof(struct SeqStack));
if(pastack != NULL)
{
pastack->s = (DataType*)malloc(sizeof(DataType)*m);
if(pastack->s)
{
pastack->MAXNUM = m;
pastack->t = -1;
return pastack;
}
else free(pastack);
}
printf("Out of space!!\n");
return NULL;
}

//判断栈是否为空
int isEmptyStack_seq(PSeqStack pastack)
{
return (pastack->t==-1);
}

//压栈操作
void push_seq(PSeqStack pastack,DataType x)
{
if(pastack->t >= pastack->MAXNUM-1)
{
printf("Overflow!\n");
}
else
{
pastack->t = pastack->t+1;
pastack->s[pastack->t] = x;
}
}

//弹栈操作
void pop_seq(PSeqStack pastack)
{
if(pastack->t == -1)
{
printf("Underflow!\n");
}
else
pastack->t = pastack->t - 1;
}

//返回栈顶元素
DataType top_seq(PSeqStack pastack)
{
if(pastack->t == -1)
{
printf("It is empty!\n");
}
else
return pastack->s[pastack->t];
}

void print(int maze[][EmpCount])
{
printf("\t\t-1\t");
for(int m=0;m<EmpCount;m++)
printf("%d ",m);
printf("\n");
//maze[5][5] =1;
for(m=0;m<EmpCount;m++)
{
printf("\n\t\t%d\t",m);
for(int n=0;n<EmpCount;n++)
if(maze[m][n]==1)
printf("▲");
else
if((m+n)%2==0)
printf("□");//■");
else
printf("□");
}
printf("\n\t\t\t");
}

bool checkEmp(PSeqStack pastack,int i,int j)
{
if(isEmptyStack_seq(pastack))
return false;
if( i>=EmpCount || j>=EmpCount)
return true;
DataType element;
for(int k=0;k!=pastack->t+1;k++)
{
element = pastack->s[k];
if( (i==element.x) || (j==element.y) || (abs(j-element.y)==(i-element.x)) )
{
return true;
}
}
return false;
}

void Empress(int maze[][EmpCount])
{
int allCount = 0;
int oneEmpress [EmpCount][2];
int count = 0;
int test;
DataType element,element1;
PSeqStack pastack = createEmptyStack_seq(EmpCount);
for(int k=0;k!=EmpCount;k++)
{
oneEmpress[k][0]=0;
oneEmpress[k][1]=0;
}
int i=0,j=0;
int g,h;
element.x = 0;
element.y = 0;
push_seq(pastack,element);
while(!isEmptyStack_seq(pastack))
{
element = top_seq(pastack);
pop_seq(pastack);
i = element.x;
j = element.y+1;
while(i<EmpCount)
{
if(!checkEmp(pastack,i,j))
{
element.x = i;
element.y = j;
push_seq(pastack,element);
i++;
j=0;
}
else
{
if(j<EmpCount-1)
j++;
else
{
element = top_seq(pastack);
pop_seq(pastack);
i = element.x;
j = element.y;
if(j<EmpCount-1)
j++;
else
break;
}
}
}
if(pastack->t==EmpCount-1)
{
printf("\n\r第%d个八皇后图\n",++allCount);
for(int k=0;k<=pastack->t;k++)
{
printf("the node is:%d,%d\n",pastack->s[k].x,pastack->s[k].y);
maze[pastack->s[k].x][pastack->s[k].y]=1;
}
print(maze);
for(int i=0;i!=EmpCount;i++)
{
for(int j=0;j<EmpCount;j++)
maze[i][j] = 0;
}
pastack->s[pastack->t].y = pastack->s[pastack->t].y+1;
}
}
}

void main()
{
int maze[EmpCount][EmpCount];
for(int i=0;i!=EmpCount;i++)
{
for(int j=0;j<EmpCount;j++)
maze[i][j] = 0;
}
Empress(maze);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值