N皇后的求解,这里求8皇后

/**********************************
N皇后的求解,这里求8皇后
                颜清国
                        06.05.02
***********************************/
#include "stdlib.h"
#include "stdio.h"
#define LEN sizeof(queen)
               /*这里指定为八皇后,可以改为N皇后*/

/*队列的结构体*/
typedef struct tagqueen
{
	int x,y;
	struct tagqueen*parent; /*指向双亲结点*/
	struct tagqueen*next;   /*指向下一个结点*/
}queen;

int y=0,num=0;              /*指明当前所在的列和已经求得的解的个数*/
int NUM=8;
queen*front,*rear;         /*队列的头尾指针*/

void DispResult();         /*输出结果*/

void EnterQueen(int x,int y); /*一个点入队列*/

int CheckChees(queen*current,int x,int y);/*检查是否可以在当前位置下子*/



/*********************************
一个结点入队列
**********************************/
void EnterQueen(int x,int y)
{
	queen*lp=(queen*)malloc(LEN);
	lp->x=x;
	lp->y=y;
	lp->parent=front;
	lp->next=NULL;
	rear->next=lp;        /*尾指针将新加进的结点加进链表中*/
	rear=rear->next;      /*尾指针下移,指向队尾*/
}

/************************************
输出一个解
*************************************/
void DispResult()
{
	queen*lp=front;
	int n=0;
	while(lp->parent!=NULL)/*检查是否已经下到了八个子*/
	{
		n++;
		lp=lp->parent;
	}
	if(n==NUM)           /*如果下到八个子,说明已经求到解,输出*/
	{
		lp=front;
		while(lp->parent!=NULL)
		{
			printf("(%d,%d)",lp->y,lp->x);
			lp=lp->parent;
		}
		printf("  %d/n",num++);  /*输出已得到的解的个数*/
	}
}

/****************************************
检查是否可以入队列,即可以下子
*****************************************/
int CheckChees(queen*current,int x,int y)
{
	queen*lp=current;
	while(lp->parent!=NULL)/*将当前结点与以前各结点比较*/
	{
		/*以下是四种不能下子的情况*/
		if((lp->x==x) || (lp->y==y) ||
			(lp->x+lp->y==x+y) ||
			(lp->x-lp->y == x-y))
            return 0;
		else
            lp=lp->parent; /*循环比较其前面的每个结点*/
	}
	return 1;
}

/********************************************************************
 主函数入口
 *******************************************************************/
void main()
{
	int i=0;
	queen*current=NULL;
	queen*head=(queen*)malloc(LEN);
	head->parent=NULL;/*分配头结点,不存储任何东西*/
	head->next=NULL;
	front=rear=head;
	printf("Input the queen number:");
	scanf("%d",&NUM);
	printf("/n");
	for(;i<=NUM-1;i++)
	{
		EnterQueen(i,y); /*第一行的八个结点入栈*/
	}
	while(front!=rear)   /*队列不为空*/
	{
		front=front->next;/*队列的头指针前移*/
		current=front;    /*取得当前队首元素,即出队*/
		y=(current->y==NUM-1) ? NUM-1 : current->y+1;/*指示当前接点的孩子的Y值*/
		if(y==NUM-1)
			DispResult();    /*如果已经到达最后一列,检测并输出结果*/
		for(i=0;i<=NUM-1;i++)   /*检查所有的孩子*/
		{
			if(CheckChees(current,i,y))  /*是否能够入对,即不和皇后发生冲突*/
				EnterQueen(i,y);         /*元素入队列*/
		}
	}
	scanf("%d",&num);                 /*暂停*/
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值