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); /*元素入队列*/
}
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值