`
猫不吃的鱼
  • 浏览: 158606 次
  • 性别: Icon_minigender_1
  • 来自: 芜湖市
社区版块
存档分类
最新评论

穷举法和回溯法求解八皇后

 
阅读更多
八皇后是数学家高斯提出的趣题,即在国际象棋中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)+" 毫秒");
	}

回溯法求解八皇后,思路是,当前位的皇后数字都无法满足条件时,就回溯到上一个皇后位置,上一个皇后,达到满足条件时,继续下一个皇后的列举判断。直到第一个皇后都无法满足条件为止。
1
1
分享到:
评论
1 楼 abcd0553 2012-04-12  
YCY,过劲蛮

相关推荐

    回溯法解决八皇后问题

    回溯法通常用于求解组合优化问题,如旅行商问题(TSP)、图着色问题、以及本文将讨论的八皇后问题。 ##### (二)回溯法的工作原理 1. **定义解空间**:首先明确问题的解空间,即所有可能解的集合。对于八皇后问题而...

    经典 算法思想 穷举法 高精度 动态规划 回溯 贪心 排列组合 排序

    常用于解决组合优化问题,如八皇后问题、图着色问题、旅行商问题等。 5. **贪心算法**:贪心算法在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,希望导致结果是全局最好或最优。比如Prim算法用于...

    数据结构 课程设计 八皇后问题(C语言源程序 + Word版课程设计说明书)

    通过对题意的分析与计算,八皇后问题总体来说可以有三种求解方式,分别为穷举法、递归法、回溯法,而本题中因为皇后的数量较多,因此本课程设计中只采用了递归法和回溯法来解决八皇后问题。递归是一种比较简单且比较...

    数据结构与算法-五大常用算法总结(分治法,回溯法,分治限界法,贪心算法,动态规划法),算法数据结构

    回溯法是一种试探性的搜索策略,常用于解决组合优化问题,如八皇后问题。它通过深度优先搜索状态空间树来寻找解。在搜索过程中,每次扩大当前部分解时,都会面临一个可选的状态集合。如果在某个节点无法继续深入,...

    回溯法典型题

    回溯法是一种解决问题的有效算法,尤其适用于解决组合优化问题,如图着色、八皇后问题、旅行商问题等。在给定的“邮票题”中,回溯法被用来找到一组邮票面值,使得在不超过M张邮票的限制下,能够组合出从1到最大可能...

    回溯算法的N皇后

    2. **前向检查的回溯法**:此方法在基本回溯算法的基础上添加了前向检查步骤,即在尝试放置皇后之前先检查其后的格子是否会被该皇后攻击。这样可以提前避免无效的尝试,减少回溯次数,提高效率。在N皇后问题中,这...

    深圳大学-计算机导论--raptor实验.docx

    实验的重点在于理解并应用穷举法、回溯法和递归算法。 #### 实验环境配置 - **硬件环境**: 个人计算机(PC)。 - **软件环境**: Windows 7中文版操作系统以及Raptor编程环境。 #### Raptor软件介绍 Raptor是一款...

    使用枚举算法写的八皇后源代码

    在给出的代码中,使用了C++语言实现了枚举法求解八皇后问题的算法。下面将详细解释代码中的各个部分。 #### 四、代码结构解析 1. **头文件引入**: ```cpp #include #include ``` - `iostream`:用于输入输出...

    PHP实现基于回溯法求解迷宫问题的方法详解

    回溯法是一种重要的算法,常用于解决...此外,回溯法不仅适用于迷宫问题,还可以应用于八皇后问题、数独问题、N皇后问题、旅行商问题等。掌握回溯法的基本思想和实现方式,对于提升编程解决问题的能力具有重要意义。

    马的Hamilton回路问题回溯+Hamilton_骑士巡游_

    在计算机科学领域,"马的Hamilton回路问题"和"骑士巡游问题"是图论中的经典问题。这两个概念都涉及到在给定的图形结构中寻找特定类型的...同时,这也为你进一步研究其他复杂问题,如旅行商问题或八皇后问题等打下基础。

    图的深搜+回溯练习题:POJ2197

    在图的某些问题中,如八皇后问题、迷宫求解等,回溯法可以结合DFS一起使用,形成一种有效的解决方案。 在题目"POJ2197"中,虽然具体细节没有给出,但可以推测这可能是一个需要寻找特定路径或者解的问题,要求参赛者...

    八皇后问题的两个高效的算法

    一、 求解八皇后问题是算法中回溯法应用的一个经典案例 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 在现实中,有...

    “八皇后算法之一”C++程序的SI-NS图

    5. **软件设计原则**:虽然此方法能够解决问题,但在实际应用中应考虑效率更高、更优雅的算法设计,如回溯法等。 #### 六、总结 通过对“八皇后算法之一”的C++程序进行SI-NS图的转换与解析,我们不仅可以深入了解...

    acm常用算法(分治+回溯+枚举)

    这种算法通常用于解决约束满足问题,如八皇后问题、数独等。在ACM竞赛中,回溯法常与剪枝技术结合,用于优化搜索过程,避免无效的计算。 **枚举法**: 枚举法是一种暴力求解策略,通过穷举所有可能的解来寻找正确...

    子集和数 C语言求解

    这种方法常用于约束满足问题和组合优化问题,例如八皇后问题、数独等。 在解决子集和数问题时,我们可以定义一个递归函数,该函数接受当前子集、目标和以及原始数集作为参数。在每次递归调用中,我们将当前数集中的...

    计算机常用算法计算机常用算法

    在计算机科学中,算法可以分为多种类型,包括动态规划、穷举法、递归法、回溯法、模拟法以及分治法和贪心法等。下面我们将深入探讨这些算法及其应用。 1. **穷举法(枚举法)**: 枚举法是一种基于搜索的策略,它...

    算法设计题集130620158.doc

    回溯法是一种有选择地搜索,当发现错误时回退并尝试其他路径,如八皇后问题;贪婪法追求局部最优解,例如在背包问题中选择价值最大的物品;分治法将大问题拆分为小问题,如快速排序。 递推法是通过建立从简单到复杂...

    北京大学_acm程序设计_图论讲义

    ### 北京大学_acm程序设计_图论讲义 ...此外,还介绍了一些常用的算法,如穷举法、贪心法、深度优先/广度优先搜索、回溯法和动态规划法等。这些知识对于理解和解决复杂的计算机科学问题至关重要。

    常用算法设计方法(C语言)

    在C语言中,回溯法常用于解决组合优化问题,如八皇后问题、数独填充等。它结合了深度优先搜索和剪枝策略,以避免无效的计算。 6. **分治法**: 分治法将大问题分解为小问题,然后分别解决,最后合并小问题的解得到...

Global site tag (gtag.js) - Google Analytics