大学期间学数据结构做的.选择解法--回溯法演示 命令--开始 下一个解 或者加速演示速度可以自动演示,代码如下:
/********************************************************************
* 文件名: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); /*元素入队列*/
}
}
}
- 大小: 54.1 KB
分享到:
相关推荐
N皇后问题是一个经典的计算机科学问题,它涉及到在N×N的棋盘上放置N个皇后,使得皇后之间不能互相攻击,即任何两个皇后都不能处于同一行、同一列或同一对角线上。这个问题常用于演示回溯算法和递归在解决约束满足...
动态演示、可调节求解速度、查看所有可行解,
**n皇后问题**是计算机科学中的一个经典问题,它的目标是在一个n×n的棋盘上放置n个皇后,使得任何两个皇后都不会在同一行、同一列或同一对角线上相互攻击。这个问题通常用来演示回溯算法和深度优先搜索(DFS)在...
在实际编程实现中,`CSPAlgorithms`可能包含了具体的代码示例,演示如何使用最小冲突法解决n皇后问题。这些代码通常会包含数据结构(如队列或栈用于存储待处理的变量)、搜索算法(如回溯或局部搜索)以及冲突检测和...
N皇后问题是一个经典的计算机科学问题,它涉及到在N×N的棋盘上放置N个皇后,使得皇后之间不能互相攻击,即任何两个皇后都不能处于同一行、同一列或同一斜线上。这个问题通常用来演示和练习回溯算法以及数据结构的...
在这个“N皇后问题 c++ 窗体演示(fableboy)”项目中,开发者使用C++编程语言,结合Microsoft Foundation Classes (MFC)库创建了一个图形化的用户界面,让用户能够直观地看到N皇后问题的解法过程。MFC是微软提供的...
本软件运行此程序,可使用安装程序,序列号任意。 本程序演示八皇后问题的求解过程。 不安装也可使用,直接运行EightQueen.exe即可。
根据给定的信息,本文将详细解释“N皇后问题”及其回溯法求解方案。 ### N皇后问题概述 N皇后问题是指在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都不会互相攻击(即任何两个皇后不能位于同一行、同一列或...
《C++ MFC实现的N皇后动态可视化》 在计算机科学领域,算法是解决问题的核心工具,而可视化技术则能帮助我们更好地理解这些算法的运行过程。本项目将这两种概念巧妙结合,通过C++编程语言,利用Microsoft ...
C#版八皇后问题,带皇后图片,可以参考,入门级。学习数据结构用。回溯
算法课设中很经典的一个问题--N皇后问题,图形用户界面演示,求解过程
1. **结果演示.mp4**:这是一个视频文件,展示了使用Python和Pygame实现的N皇后问题的运行效果。通过动态演示,用户可以看到皇后如何被放置在棋盘上,以及如何在满足条件的情况下进行移动和尝试,直至找到所有可能的...
N皇后问题是一个经典的计算机科学问题,它涉及到在N×N的棋盘上放置N个皇后,使得皇后之间不能互相攻击,即任何两个皇后都不能处于同一行、同一列或同一斜线上。这个问题通常用来演示和理解各种算法,如回溯、迭代法...
1. 源代码:实现遗传算法求解N皇后问题的具体编程代码,可能是用Python、Java或其他编程语言编写,通过编程实现上述遗传算法的各个步骤,为学习者提供了直观的实现示例。 2. 课设报告:详细阐述了N皇后问题的背景、...
### N皇后问题解析及Java实现 #### 一、N皇后问题概述 N皇后问题是一个经典的回溯算法案例,其目标是在一个N×N的棋盘上放置N个皇后,使得任意两个皇后不会在同一行、同一列或相同的对角线上。这个问题在计算机...
在回溯法求解N皇后问题的过程中,我们首先将皇后放置在棋盘的第一行,然后尝试在下一行放置皇后,同时确保它不与已放置的皇后冲突。如果找到一个可行的位置,我们就继续在下一行进行尝试。如果没有找到,我们会回溯...
5. **回溯与分支限界**:如八皇后问题、N皇后问题、旅行商问题等。这些算法用于在大量可能的解决方案中寻找最优解。Flash演示可以模拟搜索过程,展示何时回溯和剪枝,有助于理解其搜索策略。 6. **贪心算法**:如...