/********************************** 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); /*暂停*/ }
N皇后的求解,这里求8皇后
最新推荐文章于 2018-12-11 18:43:33 发布