文档库 最新最全的文档下载
当前位置:文档库 › N皇后问题Java回溯法实现

N皇后问题Java回溯法实现

N皇后问题Java回溯法实现
N皇后问题Java回溯法实现

public class Queens {

int N;

int X[];

static long count = 0;

public Queens(int N){

this.N = N;

X = new int[N+1];

}

public boolean Place(int k){

int i = 1;

while(i

if((X[i]==X[k])||(Math.abs(X[i]-X[k])==Math.abs(i-k))) //同一列或对角线return false;

i++;

}

return true;

}

public void Print(){

count++;

for(int i=1;i

System.out.print(X[i]+"\t");

System.out.println();

}

public void Position(){

int k = 1; //当前行

X[1] = 0; //当前列

while(k>0){

X[k] = X[k]+1; //移到下一列

while(X[k]<=N&&!Place(k)){

X[k] = X[k]+1;

}

//System.out.print(k+":"+X[k]+" ");

if(X[k]<=N){ //找到一个位置

if(k==N){

Print();k--; //回溯到上一层,查找下一个

}else{

k++;X[k]=0; //转到下一行

}

}else{

k = k-1; //回溯到上一层

}

}

}

public static void main(String[] args) {

Queens queens = new Queens(16); //修改此处的数字可求任意皇后问题

long begintime = System.currentTimeMillis();

queens.Position();

System.out.println("\r\nOK,共有"+count+"种解法!");

long endtime = System.currentTimeMillis();

System.out.println("耗时"+(endtime-begintime)/1000+" 秒");

}

}

回溯法之N皇后问题(C语言)

//回溯法之N皇后问题当N>10,就有点抽了~~ /*结果前total行每行均为一种放法,表示第i行摆放皇后的列位置,第total+1行,输出total*/ #include #include int n,stack[100]; //存当前路径 int total; //路径数 void make(int l) //递归搜索以stack[l]为初结点的所有路径 { int i,j; //子结点个数 if (l==n+1) { total=total+1; //路径数+1 for(i=1;i<=n;i++) printf("%-3d",stack[i]); //输出第i行皇后的列位置stack[i] printf("\n"); exit; //回溯(若试题仅要求一条路径,则exit改为halt即可)} for (i=1;i<=n;i++) { stack[l]=i; //算符i作用于生成stack[l-1]产生子状态stack[l]; if (!att(l,i)) make(l+1); } //再无算符可用,回溯 } int att(int l,int i) { int k; for (k=1;k

算法实验 递归回溯解八皇后问题

深圳大学实验报告 课程名称:算法分析与复杂性理论 实验项目名称:八皇后问题 学院:计算机与软件学院 专业:软件工程 指导教师:杨烜 报告人:学号:班级:15级软工学术型 实验时间:2015-12-08 实验报告提交时间:2015-12-09 教务部制

一.实验目的 1.掌握选回溯法设计思想。 2.掌握八皇后问题的回溯法解法。 二.实验步骤与结果 实验总体思路: 根据实验要求,通过switch选择八皇后求解模块以及测试数据模块操作,其中八皇后模块调用摆放皇后函数模块,摆放皇后模块中调用判断模块。测试数据模块主要调用判断模块进行判断,完成测试。用一维数组保存每行摆放皇后的位置,根据回溯法的思想递归讨论该行的列位置上能否放置皇后,由判断函数Judge()判断,若不能放置则检查该行下一个位置。相应结果和过程如下所示(代码和结果如下图所示)。 回溯法的实现及实验结果: 1、判断函数 代码1: procedure BTrack_Queen(n)

皇后问题 2.测试数据0.退出**"<>n; switch(n){ case 0: cout<<"退出程序成功..."<

回溯法实验(n皇后问题)

算法分析与设计实验报告第六次实验

附录: 完整代码(回溯法) //回溯算法递归回溯n皇后问题#include #include #include #include"math.h" using namespace std; class Queen

{ friend int nQueen(int); //定义友元函数,可以访问私有数据 private: bool Place(int k); //判断该位置是否可用的函数 void Backtrack(int t); //定义回溯函数 int n; //皇后个数 int *x; //当前解 long sum; //当前已找到的可行方案数 }; int main() { int m,n; for(int i=1;i<=1;i++) { cout<<"请输入皇后的个数:"; //输入皇后个数 cin>>n; cout<<"皇后问题的解为:"<

n皇后问题算法实验报告

算法分析与设计实验报告 实验内容:N皇后问题 实验时间:2013.12.3 姓名:杜茂鹏 班级:计科1101 学号:0909101605

一、实验内容及要求 在n×n格的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 二、实验目的 1.巩固和加深对回溯法的理解 2.了解递归和迭代法在回溯法中的应用 三、算法分析 1.理解皇后不被攻击的条件:n后问题等价于在n*n格的棋盘上放置n个皇后,任何两个皇后不能放在同一行或同一列或同一斜线上。 2.算法模块简要分析 用数组存储皇后的位置,将i设置为0. Int place(*x,n) :数组x[] 用来表示列数,n为皇后个数,用来判断皇后是否被攻击,判断的条件是(x[i]-x[n]==i-n||x[i]-x[n]==n-i||x[i]==x[n])即用来判断“同一行或同一列或同一斜线上”。 Int print(*x,n):打印皇后解的空间。 Int iniprint(*x,n):初始化打印函数,相当于对棋盘初始化。将可以放皇后的位置记为“1”,不放皇后的位置记为“0”。 Int Nqueen(int n):n皇后问题求解,如果满足一组可行解,sum++。Int i=0,如果x[i]>=n的时候即进行下一行,i++;当i=n时,

sum++;输出该组可行解的个数和位置的矩阵。并且i--,回溯到上一层继续搜索可行解。 四、运行结果及分析 1、三皇后没有可行解 2、 2.4个皇后有2个可行解 3.5皇后有10个可行解 五、源代码 #include static int n, sum=0;//可行解个数 static int locate[20]; int place(int k) {//判断是否在一条线上并返回0,1 for(int i=1;in){

第五组回溯算法(N皇后排列方法问题)

实训一 N皇后排列方法问题的回溯算法与实现 一、设计目的 1)掌握N皇后排列方法问题的回溯算法; 2)进一步掌握回溯算法的基本思想和算法设计方法; 二、设计内容 1.任务描述 1)算法简介 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再 走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 2)N皇后排列方法问题简介 在N*N格的棋盘上放置彼此不受攻击的N个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在N*N格的棋盘上放置N个皇后,任何2个皇后不放在同一行或同一列或同一斜线上. 3)设计任务简介 对于回溯类似的问题。首先,要能理解该问题运用到的回溯的概念;其次,根据回溯相关的基本思想,找出相应的数学公式;最后,进行程序的设计和编写。 利用回溯的基本思想和计算步骤,有助于我们解决生活中遇到的各种数学问题。 4)问题分析 由于这是一个平面上棋子布局处理问题,因此,我们可以将问题看成是一个二维数组问题。给八个皇后分别编号为1,2,…,8,其中第i个皇后放置在第i行上,并这就解决了不同皇后分别摆放在 不同列的问题,这样又可以把问题简化为一个一维数组的问题,假设用一维数组x[i]来存放皇后所放 置的列,对于第i个皇后,假设它存放在x[i]列上,则对应的x数组应满足如下的条件:[2] 1)因为一共只有8列,故x[i]的取值只能取1到8之间的数。 2)因为不同的皇后只能粗放在不同的列上,则对于任意的i和j,应满足如果i!=j,则x[i]!=x[j] 3)因为不同的皇后不能存放在同一对角线上,故连接两个皇后的直线的斜率应不能等于正负1,而 连接任意第i个皇后和第j个皇后(i与j不同)的直线的斜率的计算公式为:(x[i]-x[j])/(i-j), 即(x[i]-x[j])/(i-j)!=±1,即:|x[i]-x[j]|!=| i-j | N皇后排列方法问题的表示方案

回溯法解八皇后问题

回溯法解八皇后问题 在N * N 格的棋盘上放置彼此不受攻击的N 个皇后。N个皇后问题等价于在N * N 格的棋盘上放置N 个皇后,任何2个皇后不在同一行或同一列或同一斜线上。当N等于8,就是著名的八皇后问题。 此问题是通过C语言程序编写的,在Turboc环境下完成实现的。输出结果见(输出结果。TXT文件) 详细代码为: /*///////////////////////////////////////////////////////////////////// /// /////The programming is a complex problem about the ways of queens./////// /////Programmer: Luo Xiaochun /////// /////Completed date: 2007.12 //////// /////V ersion number: Turboc 2.0 //////// /////////////////////////////////////////////////////////////////////// /*/ #include #include #define false 0 #define true 1 #define quesize 8 int gx[quesize+1]; int sum=0; int place( int k ); void print( int a[] ); void nqueens( int n ); FILE *fp; int main( ) { system("cls"); fp = fopen("outfile.txt", "w");

回溯算法与八皇后问题N皇后问题Word版

回溯算法与八皇后问题(N皇后问题) 1 问题描述 八皇后问题是数据结构与算法这一门课中经典的一个问题。下面再来看一下这个问题的描述。八皇后问题说的是在8*8国际象棋棋盘上,要求在每一行放置一个皇后,且能做到在竖方向,斜方向都没有冲突。更通用的描述就是有没有可能在一张N*N的棋盘上安全地放N个皇后? 2 回溯算法 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中找出满足某种要求的可能或最优的情况,从而得到整个问题的解。回溯算法就是解决这种问题的“通用算法”,有“万能算法”之称。N皇后问题在N增大时就是这样一个解空间很大的问题,所以比较适合用这种方法求解。这也是N皇后问题的传统解法,很经典。 下面是算法的高级伪码描述,这里用一个N*N的矩阵来存储棋盘: 1) 算法开始, 清空棋盘,当前行设为第一行,当前列设为第一列 2) 在当前行,当前列的位置上判断是否满足条件(即保证经过这一点的行,列与斜线上都没 有两个皇后),若不满足,跳到第4步 3) 在当前位置上满足条件的情形: 在当前位置放一个皇后,若当前行是最后一行,记录一个解; 若当前行不是最后一行,当前行设为下一行, 当前列设为当前行的第一个待测位置;

若当前行是最后一行,当前列不是最后一列,当前列设为下一列; 若当前行是最后一行,当前列是最后一列,回溯,即清空当前行及以下各行的棋盘,然后,当前行设为上一行,当前列设为当前行的下一个待测位置; 以上返回到第2步 4) 在当前位置上不满足条件的情形: 若当前列不是最后一列,当前列设为下一列,返回到第2步; 若当前列是最后一列了,回溯,即,若当前行已经是第一行了,算法退出,否则,清空当前行及以下各行的棋盘,然后,当前行设为上一行,当前列设为当前行的下一个待测位置,返回到第2步; 算法的基本原理是上面这个样子,但不同的是用的数据结构不同,检查某个位置是否满足条件的方法也不同。为了提高效率,有各种优化策略,如多线程,多分配内存表示棋盘等。 为了便于将上述算法编程实现,将它用另一种形式重写: Queen() Loop: if check_pos(curr_row, curr_col) == 1 then put_a_queen(curr_row, curr_col); if curr_row == N then record_a_solution(); end if; if curr_row != N then curr_row = curr_row + 1; curr_col = 1; else if curr_col != N then curr_col = curr_col + 1; else backtrack(); end if; end if; else if curr_col != N then

回溯法实验(n皇后问题)(迭代法)

算法分析与设计实验报告第三次附加实验

附录: 完整代码(回溯法) //回溯算法递归回溯n皇后问题#include #include #include #include"math.h" using namespace std; class Queen

{ friend int nQueen(int); //定义友元函数,可以访问私有数据 private: bool Place(int k); //判断该位置是否可用的函数 void Backtrack(int t); //定义回溯函数 int n; //皇后个数 int *x; //当前解 long sum; //当前已找到的可行方案数 }; int main() { int m,n; for(int i=1;i<=1;i++) { cout<<"请输入皇后的个数:"; //输入皇后个数 cin>>n; cout<<"皇后问题的解为:"<

实验报告:回溯法求解N皇后问题(Java实现)

实验报告 一、实验名称:回溯法求解N皇后问题(Java实现) 二、学习知识: 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并以此慢慢地扩大问题规模,迭代地逼近最终问题的解。这种迭代类似于穷举并且是试探性的,因为当目前的可能答案被测试出不可能可以获得最终解时,则撤销当前的这一步求解过程,回溯到上一步寻找其他求解路径。 为了能够撤销当前的求解过程,必须保存上一步以来的求解路径,这一点相当重要。 三、问题描述 N皇后问题:在一个 N * N 的国际象棋棋盘中,怎样放置 N 个皇后才能使 N 个皇后之间不会互相有威胁而共同存在于棋局中,即在 N * N 个格子的棋盘中没有任何两个皇后是在同一行、同一列、同一斜线上。 深度优先遍历的典型案例。 四、求解思路 1、求解思路:最容易想到的方法就是有序地从第 1 列的第 1 行开始,尝试放上一个皇后,然后再尝试第 2 列的第几行能够放上一个皇后,如果第 2 列也放置成功,那么就继续放置第 3 列,如果此时第 3 列没有一行可以放置一个皇后,说明目前为止的尝试是无效的(即不可能得到最终解),那么此时就应该回溯到上一步(即第 2 步),将上一步(第 2 步)所放置的皇后的位置再重新取走放在另一个符合要求的地方…如此尝试性地遍历加上回溯,就可以慢慢地逼近最终解了。 2、需要解决的问题:如何表示一个 N * N 方格棋盘能够更有效?怎样测试当前所走的试探路径是否符合要求?这两个问题都需要考虑到使用怎样的数据结构,使用恰当的数据结构有利于简化编程求解问题的难度。 3、我们使用以下的数据结构: int column[col] = row 表示第 col 列的第 row 行放置一个皇后 boolean rowExists[i] = true 表示第 i 行有皇后 boolean a[i] = true 表示右高左低的第 i 条斜线有皇后(按→↓顺序从1~ 2*N -1 依次编号) boolean b[i] = true 表示左高右低的第 i 条斜线有皇后(按→↑顺序从1~ 2*N -1 依次编号) 五、算法实现 对应这个数据结构的算法实现如下:

回溯算法解决N皇后问题实验及其代码

实验报告4 回溯算法 实验4 回溯算法解决N皇后问题 一、实验目的 1)掌握回溯算法的实现原理,生成树的建立以及限界函数的实现; 2)利用回溯算法解决N皇后问题; 二、实验内容 回溯算法解决N皇后问题。 三、算法设计 1)编写限界函数bool PLACE(int k,int x[]),用以确定在k列上能否放置皇后; 2)编写void NQUEENS(int n)函数用以摆放N个皇后; 3)编写主函数,控制输入的皇后数目; 4)改进和检验程序。 四、程序代码 //回溯算法解决N皇后问题的c++程序 #include #include using namespace std; int count=0; //皇后摆放的可能性 bool PLACE(int k,int x[]);//限界函数 void NQUEENS(int n);//摆放皇后 int main() { int queen; cout<<"先生(女士)请您输入皇后的总数,谢谢!:"<>queen; NQUEENS(queen); cout<<"所有可能均摆放完毕,谢谢操作"<

void NQUEENS(int n){ /*此过程使用回溯算法求出在一个n*n棋盘上放置n个皇后,使其即不同行,也不同列,也不在同一斜角线上*/ int k, *x=new int[n];//存放皇后所在的行与列 x[0]=0; k=0; while (k>=0&&k

回溯法n皇后问题

1、方法思想 回溯法是一个既带有系统性又带有跳跃性的搜索算法。它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至解空间树的任何一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯;否则进入该子树,继续按深度优先策略搜索。 代码实现: class Queen { friend int nQueen(int) private: bool Place(int k); void Backtrack(int t); int n, //皇后个数 *n; //当前解 long sum; //当前已找到的可行方案数 }; bool Queen::Place(int k) { for (int j=1;jn) sum++; //达到叶结点 else for (int i=1;i<=n;i++) { //搜索子结点 x[t]=i; //进入第i个子结点 if (Place(t)) Backtrack(t+1); } } int nQueen(int n) { Queen X; //初始化X X.n=n; X.sum=0; int *p=new int [n+1]; for(int i=0;i<=n;i++) p[i]=0; X.x=p; X.Backtrack(1); //对整个解空间回溯搜索

人工智能课程设计报告-n皇后问题解读

课程:人工智能课程设计报告 班级: 姓名: 学号: 指导教师:赵曼 2015年11月

人工智能课程设计报告 课程背景 人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。 人工智能是对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。 人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。 人工智能是计算机学科的一个分支,二十世纪七十年代以来被称为世界三大尖端技术之一(空间技术、能源技术、人工智能)。也被认为是二十一世纪三大尖端技术(基因工程、纳米科学、人工智能)之一。这是因为近三十年来它获得了迅速的发展,在很多学科领域都获得了广泛应用,并取得了丰硕的成果,人工智能已逐步成为一个独立的分支,无论在理论和实践上都已自成一个系统。 人工智能是研究使计算机来模拟人的某些思维过程和智能行为(如学习、推理、思考、规划等)的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。人工智能将涉及到计算机科学、心理学、哲学和语言学等学科。可以说几乎是自然科学和社会科学的所有学科,其范围已远远超出了计算机科学的范畴,人工智能与思维科学的关系是实践和理论的关系,人工智能是处于思维科学的技术应用层次,是它的一个应用分支。从思维观点看,人工智能不仅限于逻辑思维,要考虑形象思维、灵感思维才能促进人工智能的突破性的发展,数学常被认为是多种学科的基础科学,数学也进入语言、思维领域,人工智能学科也必须借用数学工具,数学不仅在标准逻辑、模糊数学等范围发挥作用,数学进入人工智能学科,它们将互相促进而更快地发展。

回溯法求N皇后问题

Tree-回溯法求N皇后问题 #include #include #define N 4 //N皇后 typedef int Chessboard[N + 1][N + 1]; //第0号位置不用 bool check(Chessboard cb, int i, int j) { //看棋盘cb是否满足合法布局 int h, k; int m = i + j, n = i - j; for(h=1; hn时,求得一个合法的布局,输入之。*/ void trial(int i, Chessboard &cb) { int j; if(i > N) printfChessboard(cb); else { for(j=1; j<=N; j++) { cb[i][j] = 1; if(check(cb, i, j)) trial(i + 1, cb); cb[i][j] = 0; } } } void main() { int i, j; Chessboard cb; for(i=1; i<=N; i++) for(j=1; j<=N; j++) cb[i][j] = 0; //必须初始化,它的默认值不是0

n皇后问题算法设计

算法设计及分析

n皇后问题---回溯求解 国际象棋中皇后威力很大,它可以象“车”一样沿直线上下或左右移动;也可以如同 “象”那样沿着斜线移动。双方的皇后是不能在同一行或同一列或同一斜线上对持的。那么, 在一张空白的国际象棋盘上最多可以放上几个皇后并且不让它们互相攻击呢?这个问题是伟 大数学家高斯在十九世纪中期提出来的,并作了部分解答。高斯在棋盘上放下了N个互不攻 击的皇后,他还认为可能有N种不同的放法,这就是有名的“N皇后”问题。如果你动手试试, 就一定会发现开头几颗皇后很容易放置,越到后来就越困难。由于我们的记忆有限,很可能 在某个位置放过子后来证明不行取消了,但是以后又重新放上子去试探,这样就会不断地走 弯路,花费大量的精力。因此,必须找到一个简易有效、有条不紊的法则才行。 回溯法的基本思想: 对于用回溯法求解的问题,首先要将问题进行适当的转化,得出状态空间树。这棵树的 每条完整路径都代表了一种解的可能。通过深度优先搜索这棵树,枚举每种可能的解的情况; 从而得出结果。在深度优先搜索的过程中,不断的将每个解(并不一定是完整的,事实上这 也就是构造约束函数的意义所在)与约束函数进行对照从而删除一些不可能的解,这样就不 必继续把解的剩余部分列出从而节省部分时间。 不妨以8皇后为例,设8皇后为x i,她们分别在第i行(i=1,2,3,4,5,6,7,8),这样问 题的解空间就是一个8个皇后所在列的序号,为n元一维向量(x1,x2,,x3,x4,x5,x6,x7,x8),搜 索空间是1≤x i≤8(i=1,2,3,4,5,6,7,8),共88个状态。约束条件是8个点 (1,x1),(2,x2),(3,x3),(4,x4),(5,x5),(6,x6),(7,x7),(8,x8)不在同一列和同一对角线上。虽 然问题共有88个状态,但算法不会真正地搜索这么多的状态,因为回溯法采用的是“走不通 就掉头”的策略,而形如(1,1,x3,x4,x5,x6,x7,x8)的状态共有86个,由于1,2号皇后在同一 列不满足约束条件,回溯后这些状态是不会搜索的。 算法设计: 我们用三个数组c,b,d分别记录棋盘上的n个列,2n-1个住对角线和2n-1个副对角线的 占用情况。用i,j分别表示皇后所在的行列,用表达式i-j+n对主对角线编号,范围是1~2n-1, 用i+j为负对角线编号,范围为2~2n. 程序代码: #include"stdio.h" int a[20],b[20],c[40],d[40],n,i,k; int t=0; //t记录解的个数 void output() { t=t+1; printf("第%d个解:",t); for(k=1;k<=n;k++) printf("%d",a[k]); printf("\n"); } void find(int i) { int j; for(j=1;j<=n;j++) //第i个皇后有n种可能位置 if(b[j]==0&&c[i+j]==0&&d[i-j+n]==0) //判断位置是否冲突 {a[i]=j; //摆放皇后 b[j]=1; //占领第j列 c[i+j]=1;//占领两个对角线 d[i-j+n]=1; if(i

八皇后问题(回溯法)

八皇后问题(回溯法)2009-08-11 12:03问题描述: 求出在一个n×n的棋盘上,放置n个不能互相捕捉的国际象棋“皇后”的所有布局,这是来源于国际象棋的一个问题。皇后可以沿着纵横和两条斜线4个方向互相捕捉。 解题思路: 总体思想为回溯法。 求解过程从空配置开始。在第1列~的m列为合理配置的基础上,再配置第m+1列,直至第n列也是合理时,就找到了一个解。在每列上,顺次从第一行到第n行配置,当第n行也找不到一个合理的配置时,就要回溯,去改变前一列的配置。 为使在检查皇后配置的合理性方面简易方便,引入一下4个工作数组: ?数组col[i],表示在棋盘第i列,col[i]行有一个皇后; ?数组a[],a[k]表示第k行上还没有皇后; ?数组b[],b[k]表示第k列右高左低斜线上没有皇后; ?数组c[],c[k]表示第k列左高右低斜线上没有皇后; 代码: #include #include void queen(int N) { //初始化N+1个元素,第一个元素不使用int col[N+1]; //col[m]=n表示第m列,第n行放置皇后 int a[N+1]; //a[k]=1表示第k行没有皇后 int b[2*N+1]; //b[k]=1表示第k条主对角线上没有皇后 int c[2*N+1]; //c[k]=1表示第k条次对角线上没有皇后 int j,m=1,good=1;char awn; for(j=0;j<=N;j++) {a[j]=1;} for(j=0;j<=2*N;j++) {b[j]=c[j]=1;} col[1]=1;col[0]=0; do { if(good) { if(m==N) //已经找到一个解

回溯法之N皇后问题(C语言)

回溯法之N皇后问题(C语言) #include#include int n,stack[100]; //存当前路径int total; //路径数 void make(int l) //递归搜索以stack[l]为初结点的所有路径{ int i,j; //子结点个数 if (l==n+1) { total=total+1; //路径数+1 for(i=1;i<=n;i++) printf("%-3d",stack[i]); //输出第i行皇后的列位置stack[i] printf("\n"); exit; //回溯(若试题仅要求一条路径,则exit改为halt即可) } for (i=1;i<=n;i++) { stack[l]=i; //算符i作用于生成stack[l-1]产生子状态stack[l]; if (!att(l,i)) make(l+1); } //再无算符可用,回溯 } int att(int l,int i){ int k; for (k=1;k

八皇后问题的解决完整

淮阴工学院 数据结构课程设计报告 设计题目:八皇后 2008 年 6 月25 日 设计任务书

摘要: 八皇后问题要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击.按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子.因此,八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。 而本课程设计本人的目的也是通过用c++语言平台将一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击的92种结构予以实现.?使用递归方法最终将其问题变得一目了然,更加易懂。 关键词:八皇后 ; c++ ; 递归法 目录 .

1. 课题综述 1. 1课题的来源及意义 八皇后问题是一个古老而着名的问题,该问题是十九世纪着名的数学家高斯1850年提出的。 在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。 所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。 到了现代,随着计算机技术的飞速发展,这一古老而有趣的数学游戏问题也自然而然的被搬到了计算机上。运用所学计算机知识来试着解决这个问题是个锻炼和提高我自己编程能力和独立解决问题能力的好机会,可以使我增强信心,为我以后的编程开个好头,故我选择了这个有趣的课题。 1. 2 面对的问题 1)???解决冲突问题: 这个问题包括了行,列,两条对角线; 列:规定每一列放一个皇后,不会造成列上的冲突; 行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;

N皇后问题回溯算法c语言版

#include #include #include #define queen 8 //皇后的个数 #define INITIAL -10000 int a[queen]; // 使用一个一维数组表示皇后的位置,其中数组的下标表示皇后所在的行int sum=0; //n皇后的解数 void init() { int *p; int i; p=a; for(i=0;i

{ int i; for(i=0;i

printf("%c ",'*'); else //a[i]表示在第i行的第a[i]列可以放置皇后 printf("%c ",'@'); } printf("\n"); } printf("-----------------------------\n"); } void nqueen() //n皇后程序 { int i=0,j=0; while(i

n皇后问题 (回溯法) 原创

n后问题 问题描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 算法分析 ?解向量: (x1, x2, … , xn) ?显约束: xi=1,2, … ,n ?隐约束: 1)不同列: xi xj 2)不处于同一正、反对角线: |i-j||xi-xj| 代码实现: class Queen{friend int nQueen(int) private: bool Place(int k); void Backtrack(int t); int n,//皇后个数

*n;//当前解 long sum;//当前已找到的可行方案数 }; bool Queen: :Place(int k){for (int j=1;jn) sum++;//达到叶结点 else for (int i=1;i<=n;i++) {//搜索子结点 x[t]=i;//进入第i个子结点 if (Place(t)) Backtrack(t+1);}} int nQueen(int n){Queen X; //初始化X X.n=n; X.sum=0; int *p=new int [n+1]; for(int i=0;i<=n;i++) p[i]=0; X.x=p; X.Backtrack (1);//对整个解空间回溯搜索

实验四 回溯法求n皇后问题

本科实验报告 课程名称:算法设计与分析实验项目:回溯法求n皇后问题实验地点: 专业班级:学号:学生姓名: 指导教师:

实验四回溯法求n皇后问题 一、实验目的 1.掌握回溯算法的基本思想 2.通过n皇后问题求解熟悉回溯法 3.使用蒙特卡洛方法分析算法的复杂度 二、实验内容 要求在一个8*8的棋盘上放置8个皇后,使得它们彼此不受“攻击”。两个皇后位于棋盘上的同一行、同一列或同一对角线上,则称它们在互相攻击。现在要找出使得棋盘上8个皇后互不攻击的布局。 三、实验环境 程序设计语言:c++ 编程工具:microsoft visual studio 2010 四、算法描述和程序代码 #include #include using namespace std; int main(){ int queen[8]; int total = 0; //方案计数 int i, j, k; for (i=0;i<8;i++) queen[i] = 0; //八皇后全放在第0列 for (i=1;;){ //首先安放第0行皇后 if(queen[i]<8){ //皇后还可调整 k=0; //检查与第k个皇后是否互相攻击 while(k

相关文档
相关文档 最新文档