N皇后求解演示

大学期间学数据结构做的.选择解法--回溯法演示  命令--开始 下一个解 或者加速演示速度可以自动演示,代码如下:
/********************************************************************
*     文件名:Queen.cpp
*
*    文件描述:
*	         N皇后求解,这里求8皇后
*     
*     开发工具:turboc 2.0
* 
*     创建人:sylinx_yqg 2006年5月2日 
*
*     版本号:1.0 
**********************************************************************/
#include<stdlib.h>
#include<stdio.h>
#define LEN sizeof(queen)
#define NUM 8               /*这里指定为八皇后,可以改为N皇后*/

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

int y=0,num=0;              /*指明当前所在的列和已经求得的解的个数*/

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;
	for(;i<NUM;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;i++)   /*检查所有的孩子*/
		{
			if(CheckChees(current,i,y))  /*是否能够入对,即不和皇后发生冲突*/
				EnterQueen(i,y);         /*元素入队列*/
		}
	}
}



你可能感兴趣的:(数据结构)