八皇后是数学家高斯提出的趣题,即在国际象棋中8*8的方格的棋盘上如何放置8个皇后,使得8个皇后任何2个不能互相攻击(即不能同一纵列,不能统一横排,不能在45度斜线上)。
以下是我自己用java写的 穷举法和回溯法求八皇后。
//穷举法列出八皇后的可能性
//yuyong 2012-4-1
public class QjfBhh {
public static void main(String[] args) {
List<Integer> results = new ArrayList<Integer>();
int count = 0;
long from=System.currentTimeMillis();
for (int start = 12345678; start <= 87654321; start += 9) {
if (calculate(String.valueOf(start))) {
results.add(start);
count++;
}
}
long end=System.currentTimeMillis();
for (Integer value : results) {
System.out.println(value);
}
System.out.println("共 "+count+" 个,共耗时 "+(end-from)+" 毫秒");
}
private static boolean calculate(String str){
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='0'||str.charAt(i)=='9')
return false;
for(int j=0;j<i;j++){
if(str.charAt(i)==str.charAt(j))
return false;
if(Math.abs((i-j))==Math.abs((str.charAt(i)-str.charAt(j))))
return false;
}
}
return true;
}
}
因为不能统一横排或者纵排,所以8位数字中1到8肯定各出现一次,不可以重复。所以范围规定于[12345678,87654321] 并且穷举的步长为9,因为数字1-8各出现一次,所以,8位数字肯定为9的倍数.
//回溯法求解八皇后
//yuyong 2012-4-1
public static void main(String[] args) {
List<String> results = new ArrayList<String>();
long from=System.currentTimeMillis();
List<Integer>indexs=new ArrayList<Integer>();
for(int i=0;i<=7;i++)
indexs.add(-1);
int current=-1;
while(true){
//第一个皇后也无法满足条件时
if(current==-1&&(indexs.get(0)==7))
break;
current++;
//当前皇后已经无法满足条件时
if(indexs.get(current)==7){
indexs.set(current, -1);
current=current-2;
continue;
}
indexs.set(current, indexs.get(current)+1);
for(int j=0;j<current;j++){
if((indexs.get(current)==indexs.get(j))||(Math.abs((current-j))==Math.abs((indexs.get(current)-indexs.get(j))))){
if(indexs.get(current)==7){
indexs.set(current, -1);
current=current-2;
break;
}else{
current=current-1;
break;
}
}
}
//8个皇后均满足条件时
if(current==7){
results.add(indexs.toString());
current=current-1;
}
}
long end=System.currentTimeMillis();
for (String value : results) {
System.out.println(value);
}
System.out.println("共 "+results.size()+" 个,共耗时 "+(end-from)+" 毫秒");
}
回溯法求解八皇后,思路是,当前位的皇后数字都无法满足条件时,就回溯到上一个皇后位置,上一个皇后,达到满足条件时,继续下一个皇后的列举判断。直到第一个皇后都无法满足条件为止。
分享到:
相关推荐
回溯法通常用于求解组合优化问题,如旅行商问题(TSP)、图着色问题、以及本文将讨论的八皇后问题。 ##### (二)回溯法的工作原理 1. **定义解空间**:首先明确问题的解空间,即所有可能解的集合。对于八皇后问题而...
常用于解决组合优化问题,如八皇后问题、图着色问题、旅行商问题等。 5. **贪心算法**:贪心算法在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,希望导致结果是全局最好或最优。比如Prim算法用于...
通过对题意的分析与计算,八皇后问题总体来说可以有三种求解方式,分别为穷举法、递归法、回溯法,而本题中因为皇后的数量较多,因此本课程设计中只采用了递归法和回溯法来解决八皇后问题。递归是一种比较简单且比较...
回溯法是一种试探性的搜索策略,常用于解决组合优化问题,如八皇后问题。它通过深度优先搜索状态空间树来寻找解。在搜索过程中,每次扩大当前部分解时,都会面临一个可选的状态集合。如果在某个节点无法继续深入,...
回溯法是一种解决问题的有效算法,尤其适用于解决组合优化问题,如图着色、八皇后问题、旅行商问题等。在给定的“邮票题”中,回溯法被用来找到一组邮票面值,使得在不超过M张邮票的限制下,能够组合出从1到最大可能...
2. **前向检查的回溯法**:此方法在基本回溯算法的基础上添加了前向检查步骤,即在尝试放置皇后之前先检查其后的格子是否会被该皇后攻击。这样可以提前避免无效的尝试,减少回溯次数,提高效率。在N皇后问题中,这...
实验的重点在于理解并应用穷举法、回溯法和递归算法。 #### 实验环境配置 - **硬件环境**: 个人计算机(PC)。 - **软件环境**: Windows 7中文版操作系统以及Raptor编程环境。 #### Raptor软件介绍 Raptor是一款...
在给出的代码中,使用了C++语言实现了枚举法求解八皇后问题的算法。下面将详细解释代码中的各个部分。 #### 四、代码结构解析 1. **头文件引入**: ```cpp #include #include ``` - `iostream`:用于输入输出...
回溯法是一种重要的算法,常用于解决...此外,回溯法不仅适用于迷宫问题,还可以应用于八皇后问题、数独问题、N皇后问题、旅行商问题等。掌握回溯法的基本思想和实现方式,对于提升编程解决问题的能力具有重要意义。
在计算机科学领域,"马的Hamilton回路问题"和"骑士巡游问题"是图论中的经典问题。这两个概念都涉及到在给定的图形结构中寻找特定类型的...同时,这也为你进一步研究其他复杂问题,如旅行商问题或八皇后问题等打下基础。
在图的某些问题中,如八皇后问题、迷宫求解等,回溯法可以结合DFS一起使用,形成一种有效的解决方案。 在题目"POJ2197"中,虽然具体细节没有给出,但可以推测这可能是一个需要寻找特定路径或者解的问题,要求参赛者...
一、 求解八皇后问题是算法中回溯法应用的一个经典案例 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 在现实中,有...
5. **软件设计原则**:虽然此方法能够解决问题,但在实际应用中应考虑效率更高、更优雅的算法设计,如回溯法等。 #### 六、总结 通过对“八皇后算法之一”的C++程序进行SI-NS图的转换与解析,我们不仅可以深入了解...
这种算法通常用于解决约束满足问题,如八皇后问题、数独等。在ACM竞赛中,回溯法常与剪枝技术结合,用于优化搜索过程,避免无效的计算。 **枚举法**: 枚举法是一种暴力求解策略,通过穷举所有可能的解来寻找正确...
这种方法常用于约束满足问题和组合优化问题,例如八皇后问题、数独等。 在解决子集和数问题时,我们可以定义一个递归函数,该函数接受当前子集、目标和以及原始数集作为参数。在每次递归调用中,我们将当前数集中的...
在计算机科学中,算法可以分为多种类型,包括动态规划、穷举法、递归法、回溯法、模拟法以及分治法和贪心法等。下面我们将深入探讨这些算法及其应用。 1. **穷举法(枚举法)**: 枚举法是一种基于搜索的策略,它...
回溯法是一种有选择地搜索,当发现错误时回退并尝试其他路径,如八皇后问题;贪婪法追求局部最优解,例如在背包问题中选择价值最大的物品;分治法将大问题拆分为小问题,如快速排序。 递推法是通过建立从简单到复杂...
### 北京大学_acm程序设计_图论讲义 ...此外,还介绍了一些常用的算法,如穷举法、贪心法、深度优先/广度优先搜索、回溯法和动态规划法等。这些知识对于理解和解决复杂的计算机科学问题至关重要。
在C语言中,回溯法常用于解决组合优化问题,如八皇后问题、数独填充等。它结合了深度优先搜索和剪枝策略,以避免无效的计算。 6. **分治法**: 分治法将大问题分解为小问题,然后分别解决,最后合并小问题的解得到...