<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); /*暂停*/}
分享到:
相关推荐
n皇后问题 Very Goodn皇后问题的求解n皇后问题的求解
递归求解0/1背包算法和N皇后求解递归求解0/1背包算法和N皇后求解
代码 博文链接:https://sylinx.iteye.com/blog/215341
下面给出使用栈求解 n 皇后问题的思路: 定义一个栈,用于存储已摆放皇后的位置信息。 初始将第一个皇后放到第一行第一列,入栈。 重复以下操作,直到栈为空: 取出栈顶元素,表示当前正在处理的行。 在该行从左到...
N皇后问题求解,分别是递归方法实现和非递归方法实现,后者采用回溯方法,C语言实现的
遗传算法求解n皇后问题
c++ N皇后求解源码。。。
算法设计作业,用c++编写的,回溯法求解n皇后问题 运行环境VC6.0
回溯法求解n皇后问题,n皇后问题是一个非常有意思的游戏
应用C++编程语言在VC6.0上实现了8皇后问题的求解,并进一步扩展到N皇后问题的求解。
此过程使用回溯算法求出在一个n*n棋盘上放置n个皇后,使其任意两个皇后即不同行,也不同列,也不在同一斜角线上
利用C++中的栈数据结构实现N皇后问题的求解,使用了回溯法(循环结构)而非递归调用。
八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个...八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解。
关于n皇后的实验报告,可以详细的完成一篇实验报告,包含代码,需求分析等
C语言实现的,用栈的n皇后问题源码+流程图 深度优先遍历
使用分支限界法解决N皇后问题。因为是广度优先,而且占用比较多的额外空间,所以并不是解N皇后问题的很好的算法,主要是理解分支限界法的使用。
N皇后启发式和盲目式搜索,第一个用一个数组实现,启发式搜索用一个二维数组表示
一维数组的n皇后问题求解,其中n用define 默认值为8。有详细的注解,包含具体思路。过程简洁,输出美观。
用爬山法解决N皇后问题,3000个皇后可以在1s内求得一个解