八皇后,回溯算法

public class Queue_8 {

	public int size = 4;
	//queue i can locate at (i,loc[i])
	public int loc[] = new int[size+1];

	// 求第k个元素,放置的位置, 与已经放过的皇后比较,如果它们在同一行或一列,或者在一条斜线上(斜线是根据横坐标和纵坐标的差值比较,如果在一条斜线上,横坐标差值就会等于纵坐标差值)
	public boolean place(int k){
		int i;
		for(i=1;i<k;i++){
			if(Math.abs(k-i) == Math.abs(loc[k]-loc[i]) || loc[i] == loc[k]){
				return false;
			}
		}
		return true;
	}

	public void tracking(int t){
		int i;
		if(t > size){
			// 表示一次遍历结束,输出结果
			for(i=1;i<size+1;i++){
				System.out.print(loc[i]+"  ");
			}
			System.out.println("");
			//一次探索结束,返回到track(t)的位置,继续track(loc[t-1]+1)的位置是否符合要求
		}
		else{
			for(i=1;i<size+1;i++){
				loc[t] = i;
				//如果loc[t][i]可以放皇后,则继续探索t+1列
				if(place(t)){
					tracking(t+1);
				}
			}
		}
	}

	public static void main(String args[]){
		Queue_8 q = new Queue_8();
		//从第1位开始
		q.tracking(1);
	}
}

  

时间: 2024-10-18 14:11:57

八皇后,回溯算法的相关文章

八皇后回溯计算法研究

仔细看了下百度中的回溯法介绍,这是一种非常有用的算法,大概有两种模式,一种是遍历,一种是递归. 我把这两种方法都列出来了,按网上的说法,递归效率要比遍历快很多,我这里测试是一样的,可能是网络上那些遍历法根本没优化好吧, 多遍历了很多东西. 网上并没有Delphi的原代码,我综合了各种算法,将N阶皇后的算法一并写出来了.以下是原代码,希望有意研究的朋友跟我留言: //工程文件:Queen8.dpr,以下代码在Delphi2010下编译通过. program Queen8; uses  Forms,

八皇后回溯递归 40行不到

个人感觉代码还算精简,比较容易混淆的一点是,board[] 数组,数组下表指的是八皇后棋盘的行,数组下标对应的值指的是八皇后棋盘的列,至于abs()可以去百度,是一个求绝对值的函数 #include <iostream> using namespace std ; #define N 8 static int sum = 0 ; const int max = N ; void print (int board []) { for(int i = 0 ;i < max ;i++) { c

八皇后java算法

public class NQueens {  public static int num = 0; // 累计方案总数 public static final int MAXQUEEN = 5;// 皇后个数,同时也是棋盘行列总数 public static int[] cols = new int[MAXQUEEN]; // 定义cols数组,表示n列棋子摆放情况 public NQueens() {  // 核心函数,从第0列开始 getArrangement(0);  System.ou

八皇后92

#include <stdlib.h>   #include <stdio.h>       int m[8][8] = {0};//表示棋盘,初始为0,表示未放置皇后   int num = 0;//解数目     //对于棋盘前row-1行已放置好皇后   //检查在第row行.第column列放置一枚皇后是否可行    bool check(int row,int column)    {        if(row==1) return true;        int i

python解决八皇后问题

经典回溯算法:八皇后问题 算法要求: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上. 国际象棋的棋盘如下图所示: 问共有多少种不同的方法,并且指出各种不同的放法. # -*- coding:utf-8 -*- __author__ = "tyomcat" print("******八皇后问题的解决方法******") def next_col(current, n=8): length = len(curr

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

【八皇后问题】 回溯算法

回溯算法:回溯算法实际上是一个类似枚举的搜索尝试方法,它的思想是在搜索尝试中寻找问题的解,当发现不满足求解条件时,就“回溯”返回,尝试别的路径.之前介绍的基础算法中的贪婪算法,动态规划等都具有“无后效性”,也就是在分段处理问题时,某状态一旦确定,将不再改变.而多数问题很难找到"无后效性”的阶段划分和相应决策,而是通过深入搜索尝试和回溯操作完成的. 八皇后问题:8*8的国际象棋棋盘中放八个皇后,是任意两个皇后不能互相吃掉.规则:皇后能吃掉同一行,同一列,同一对角线的任意棋子. 模型建立:不妨设八个

【基础算法】回溯法与八皇后问题

在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行.列和斜线的敌方棋子.比中国象棋里的车强几百倍,比她那没用的老公更是强的飞起(国王只能前后左右斜线走一格).上图右边高大的棋子即为皇后. 八皇后问题是这样一个问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法?此问题在1848年由棋手马克斯·贝瑟尔提出,岂止是有年头,简直就是有年头,82年的拉菲分分钟被秒的渣都不剩. 八皇后问题是典型的回溯法解决的问题,我们以这个问题为例介绍回溯法. 所谓回溯法

经典回溯算法(八皇后问题)详解

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上 (斜率为1),问有多少种摆法.高斯认为有76种方案. 1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 计算机发明后,有多种方法可以解决此问题. 算法思路:    首先我们分析一下问题的解,我们每取出一个皇后,放入一行,共有八种不同的放法

每天刷个算法题20160519:回溯法解八皇后

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51502622 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西