问题:
在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。请求出总共有多少种摆法。下图为一种为符合条件的摆放。
思路:
因为棋盘的长宽和皇后的个数是一样的,那么,每一个皇后总是占据其中的一列(或者一行,我们这里假设皇后占据的是列,所以,第i个皇后总是在第i列上)。但是每一个皇后在行上面有很多种不同的位置,如果我们用一个数组row[i]来表示第i个皇后所处的行的位置,那么第i个皇后的坐标为(row[i],
i)。这里,我们认为皇后的编号从0开始。
因为条件要求“任意两个皇后不得处在同一行、同一列或者同一对角斜线上”。假如,我们放皇后是从0开始,然后放1,,,,一直到7。那么,我们放第i个皇后的时候,前面i-1个皇后其实已经放好了,而且都满足条件,那么放第i个皇后的时候,我们只需要看第i个皇后的位置是否和前面的i-1个皇后满足相应的条件,因为皇后都放在不同的列上,所以,我们只需要考虑是否在同一行或者在同一斜线上。代码如下:
//compare the n-th queen's row position with the previous (n-1) queen's row position,n refers to the n-th queen
public boolean isSatisfied(int n, int[] row){
for(int i = 0; i < n; i++){
//on the same row
if(row[i] == row[n]) return false;
//on the same oblique line(斜线)
if(Math.abs(row[n] - row[i]) == n - i) return false;
}
return true;
}
有了这样一个判断的方法,我们只需要把第i个皇后放在第从0到7的任意一行(for loop),然后,把第i个皇后与前面i-1个皇后的位置进行比较,如果满足,再放第i+1个皇后,直到,所有的皇后都在棋盘上了。 代码中count指的是皇后的个数。
代码核心部分:
// the main method to find all the possible cases. n refers to the n-th queens.
public void queen(int n, int[] row){
if (n == count) {
times++;
print(row);//print
return;
}
//put the nth queen to all the possible position
for(int i = 0; i < count; i++){
row[n] = i; //put the nth queen to the row i.
if(isSatisfied(n, row)) {
queen(n+1, row);
}
}
}
//print the successful case
public void print(int[] row){
System.out.println("the "+times+"th successful case");
for(int i = 0; i < count; i++){
System.out.println("the "+i+"th column, the "+row[i]+"th row");
}
}
代码其它部分:
public class BackDateQueen{
//r[i] refers to the ith queen's row position。
// count refers to the number of queens
private int count = 0;
// times refers to how many possible cases
private int times;
//constructor
public BackDateQueen(int count){
times = 0;
this.count = count;
}
public static void main(String[] args){
BackDateQueen bdq=new BackDateQueen(4);
int[] row = new int[4];
//no queen on the board
for (int i = 0; i < 4; i++) {
row[i] = -1;
}
bdq.queen(0, row);
}
}
参考:
http://blog.csdn.net/lixiaoshan_18899/article/details/1286716
http://zhedahht.blog.163.com/blog/static/2541117420114331616329/
转载请注明出处:blog.csdn.net/beiyeqingteng
分享到:
相关推荐
### 使用C语言解决八皇后问题 #### 背景与目标 八皇后问题是经典的回溯算法应用案例之一,其目标是在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都不在同一行、同一列或同一斜线上。本篇文章通过一段C语言代码...
每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的...
八皇后问题是一个经典的计算机编程问题,源于19世纪由国际象棋大师马克斯·贝瑟尔提出。在VB(Visual Basic)环境下,解决八皇后问题可以帮助初学者理解递归、回溯等编程概念,以及如何在实践中应用这些概念。下面...
### 八皇后问题详解及其MATLAB与C语言实现 #### 一、八皇后问题概述 八皇后问题是一个经典的计算机科学问题,它最早由国际象棋爱好者马克斯·贝瑟尔在1848年提出,并在1850年由弗朗西斯·高特在《德文杂志》上推广...
### C语言实现八皇后问题解析 #### 一、八皇后问题简介 八皇后问题是一个经典的回溯算法案例,最早由国际象棋爱好者马克斯·贝塞尔于1848年提出,后经由数学家卡尔·弗里德里希·高斯及詹姆斯·克拉克·马克斯韦尔...
### 八皇后问题的递归实现与C++代码解析 #### 问题背景及目标 **八皇后问题**是一个经典的计算机科学问题,其目标是在8×8的国际象棋棋盘上放置8个皇后,使得任意两个皇后都不会互相攻击。根据国际象棋规则,皇后...
### 八皇后问题详解 #### 一、问题背景与定义 八皇后问题是一个经典的问题,在计算机科学领域中常被用来作为回溯算法的教学案例。这个问题最早由著名的德国数学家卡尔·弗里德里希·高斯于1850年提出。其基本描述...
3. **残缺棋盘问题**:可能是指在不完整的棋盘上进行某些棋类游戏,如八皇后问题,要求在8x8的棋盘上放置8个皇后,使得任意两个皇后都不在同一行、同一列或同一对角线上。这类问题通常涉及回溯法或动态规划来求解。 ...
1213:八皇后问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 33706 通过数: 12525 【题目描述】 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。 【输入】 (无) 【输出】 按给定顺序和...
#### 题目1:N皇后问题(八皇后问题的扩展) **背景介绍**: N皇后问题是经典的回溯法问题之一,其核心是在N×N的棋盘上放置N个皇后,使得任意两个皇后不在同一行、同一列或同一对角线上。当N=8时,该问题就退化成...
6. **回溯法和贪心策略**:这些方法用于解决组合优化问题,例如八皇后问题、N皇后问题,或者在任务调度、资源分配等问题中。 7. **递归**:递归是Python中常见的解决问题的方式,比如计算阶乘、斐波那契数列等。 8...
终于写够一百道题啦,怎么也没想过他是这样来临的,在一个阳光明媚的冬日,写完第九十九题之后还是非常激动的,不知道第一百题做什么好,ACM群里不知怎么的就讨论起了八皇后问题(好像还是因为我发了一个非常奇怪的...
该文档是针对福建省宁化县八年级学生的英语周考试题,属于中学教育范畴,特别是中学英语教学的内容。试卷主要测试学生的英语词汇理解、句子翻译以及语法应用能力。 试卷分为三个部分:英汉互译、根据汉语提示完成...
- **应用场景**:适合解决组合优化问题,如八皇后问题、旅行商问题等。 - **优缺点**:空间占用较少,但在某些情况下可能会出现大量的回溯,导致时间效率较低。 ##### 2. 深度优先搜索与广度优先搜索 - **深度优先...
学生可能用它来解决如八皇后问题、迷宫问题或图的着色问题。 这些文件名涵盖了从基础的数据结构到高级的软件设计概念,表明这是一份综合性的编程作业,涉及了计算机科学的多个领域。学生通过这些项目,不仅锻炼了...
包括皇后问题和迷宫问题,前者要求在棋盘上放置皇后而不冲突,后者涉及路径寻找算法,如深度优先搜索或广度优先搜索。 综上所述,ACM程序设计指导电子书涵盖了广泛的程序设计知识,从基础语法到高级算法,旨在全面...
这个项目不仅让你熟悉了Python编程,还让你掌握了回溯法这一重要的算法思想,这对于解决许多其他类型的问题,如八皇后问题、图着色问题等都非常有用。继续深入学习和实践,你将在IT领域变得更加专业。