数据结构之回溯算法

借鉴:http://blog.csdn.net/baple/article/details/7181404

package database;

public class NQuee {

public static boolean Verify(int arr[],int i){                              //仅仅判断能不能放置这个皇后
        for(int k =1;k != i;k++)                                                //与前i-1行进行比较
            if(Math.abs(k-i)==Math.abs(arr[i]-arr[k]) || arr[i] == arr[k])      //具体比较的方法;
                return false;
            return true;        
    }
    public static void NQuee(int arr[] , int i , int n){
        for(int j = 1;j!=n+1;j++){                                        //这里是 尝试着往 第i行添加皇后     
            arr[i] = j;                                                   //尝试着往(i,arr[i])添加皇后      
                                                                          //这里注意:arr[i],而i是从1开始的,那么说arr[]要开辟n+1个空间   
        if(Verify(arr, i)){                                               //利用递归开始进行回溯算法
            if(i == n)                                                   //考虑是如何进行回溯的?见PPT
                ResultPrint(arr,n);                
            else
                NQuee(arr, i+1, n);
        }
        }
    }
    
    public static void ResultPrint(int arr[],int n){
        for(int a =1 ;a!=n+1 ;a++)
            System.out.print(a+","+arr[a]+";");
    }
    
    public static void main(String[] args) {
        int n = 4;
        int arr[] = new int[n+1];                                          //为什么是n+1?
        NQuee(arr,1,n);
        
    }

}

时间: 2024-12-15 07:16:19

数据结构之回溯算法的相关文章

Java数据结构之回溯算法的递归应用迷宫的路径问题

一.简介 回溯法的基本思想是:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法.当搜索到某个结点.发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该结点的前一结点,继续搜索这个结点的其他尚未搜索过的分支:如果发现这个结点也无法再继续搜索下去时,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程:这样的搜索过程一直进行到搜索到问题的解或搜索完了全部可搜索分支没有解存在为止. 该方法可以使用堆栈实现.也可以使用递归实现,递归实现的话代码比较简单,

c语言数据结构:递归的替代-------回溯算法

1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未执行的操作. 2.贴代码表现: 先序遍历二叉树: BTNode *FindNode(BTNode *b,ElementType x) { //在二叉树中查找值为x的结点 BTNode *p; if (b==NULL) return NULL; else if (b->Element==x) retu

数据结构与算法 -- 回溯算法

1.八皇后问题 //8皇后问题--回溯算法 public class Recall { int[] result = new int[8];//全局或成员变量,下标表示行,值表示queue存储在哪一列 public static void main(String[] args) { Recall recall = new Recall(); recall.cal8queues(0); } public void cal8queues(int row) {//调用方式:cal8queues(0)

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

从迷宫问题、连连看、红与黑说回溯算法遍历解空间

今天上午完成了“迷宫”问题,也思考了“2.5基本算法之搜索”的另外几个问题:小游戏(就一连连看),马走日,红与黑等.我所关注的这几个问题都可以用回溯算法来进行解决.回溯算法简单说就是当运行到叶子节点证明不是解时回到上一层节点继续遍历,如此循环直到找到一个解:如果需要全部解,可以继续遍历,如果不需要可以直接退出.很明显,回溯算法是一种深度优先的搜索算法,非常适合在解空间中找到一个解的问题. 一.迷宫问题: 1792:迷宫 总时间限制: 3000ms 内存限制: 65536kB 描述 一天Exten

C++回溯算法Demo:以4皇后问题为例

回溯算法实际上是构造一棵推理树,并由树的叶子节点反向输出历史步骤: 其中,树的构建过程较为复杂:一种简化的方法是使用链表连接和构造各个节点的关系: 以4皇后问题为例,采用C++ vector容器--避免使用指针(当然换成了整数来代替指针表达对象的位置),解决了该问题.整体算法思路清晰,便于理解. 见代码:与书中不同,此代码实际输出的是所有4皇后问题的不同走法 //title:4皇后问题的回溯算法求解 //Demo: 1)回溯算法实现4皇后问题:2)难点:树形结构的表达:3)用线性容器表达树形结构

回溯算法详解[力扣46:全排列]

解决一个回溯问题,实际上就是一个决策树的遍历过程.你只需要思考 3 个问题: 1.路径:也就是已经做出的选择. 2.选择列表:也就是你当前可以做的选择. 3.结束条件:也就是到达决策树底层,无法再做选择的条件. 如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解这些词语是什么意思,现在你先留着印象. 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result

LeetCode回溯系列(0)——回溯算法讲解

什么是回溯算法? 回溯法是一种系统搜索问题解空间的方法.为了实现回溯,需要给问题定义一个解空间.说到底它是一种搜索算法.只是这里的搜索是在一个叫做解空间的地方搜索.而往往所谓的dfs,bfs都是在图或者树这种数据结构上的搜索. 根据定义来看,要实现回溯,需要两点: 搜索 解空间 先看什么是解空间 就是形如数组的一个向量[a1,a2,....,an].这个向量的每个元素都是问题的部分解,只有当这个数组的每一个元素都填满(得到全部解)的时候,才表明这个问题得到了解答. 再看搜索 最简单的就是for循

回溯0--递归回溯算法框架

递归回溯算法框架 一.心得 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 search后面的k是轮数  三个数组:原数据数组标记数组储存结果数组 框架二 到目的地的情况要多加1,因为满足了的下一轮就好判断 二.代码 1 /* 2 递归回溯算法框架: 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 6 */ 7 /* 8 框架一 9 */ 10 int se