`
sylinx_yqg
  • 浏览: 140627 次
  • 性别: Icon_minigender_1
  • 来自: 福建 漳州
社区版块
存档分类
最新评论

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

 
阅读更多
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
/**********************************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);                 /*暂停*/}
 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics