回溯算法学习(四)

解决回溯问题,需要考虑三个问题:1、路径:已经做出的选择。2、选择列表:你可以做出的选择。3、结束条件。
模板如下:

	List<类型> result = new ArrayList<>();
	dfs(选择){
		if 满足结束条件
			result.add(路径)
		for(选择列表做选择){
			做选择
			dfs(往下遍历)
			撤销选择
		}
	}

leetcode51题N皇后问题

List<List<String>> result = new LinkedList<>();
    public List<List<String>> solveNQueens(int n) {
        LinkedList<StringBuilder> track = new LinkedList<>();
        for(int i = 0; i < n ; i++){
            StringBuilder str = new StringBuilder();
            for(int j = 0; j < n ; j++){
                str.append('.');
            }
            track.add(str);
        }
        backtrack(track,0);
        return result;
    }
    public void backtrack(LinkedList<StringBuilder> track, int row){
        // 如果每一行都成功放置了皇后,记录结果
        if(track.size() == row){
            LinkedList<String> track1 = new LinkedList<>();
            for(int i = 0; i < track.size() ; i++){
                track1.add(track.get(i).toString());
            }
            result.add(track1);
            return ;
        }
        int n = track.get(row).length();
        for(int col = 0; col < n; col++){
            //排除不合法选择
            if(!isValid(track,row,col))
                continue;
            //做选择
            track.get(row).setCharAt(col,'Q');
            backtrack(track,row+1);
            //撤销选择
            track.get(row).setCharAt(col,'.');
        }
    }
    public boolean isValid(LinkedList<StringBuilder> track,int row,int col){
        int n = track.size();
        //检查列是否有冲突
        for(int i = 0; i < n; i++){
            if(track.get(i).charAt(col) == 'Q')
                return false;
        }
        //检查左上方是否有冲突
        for(int i = row - 1,j = col - 1; i >= 0 && j >= 0; i--,j--){
            if(track.get(i).charAt(j) == 'Q')
                return false;
        }
        //检查右上方是否有冲突
        for(int i = row - 1,j = col + 1; i >= 0 && j < n ; i--,j++){
            if(track.get(i).charAt(j) == 'Q')
                return false;
        }
        return true;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《常用算法程序集(C语言描述)第版》是一本由徐士良编写的经典教材。这本书主要介绍了常用的算法和数据结构,并使用C语言进行描述和实现。 本书的内容分为两大部分:基础算法和高级算法。基础算法部分主要包括排序算法、查找算法、串与串匹配算法、树与图的基本算法等。这些算法是编程中经常使用的基础操作,对于初学者来说非常重要。高级算法部分主要包括动态规划、贪心算法、回溯算法、分治算法等。这些算法能够解决一些难度较高的问题,对于熟练掌握基础算法的人来说是进一步提高技能的重要手段。 本书的特点是理论与实践相结合。在每个算法的介绍和讲解中,徐士良不仅详细解释了其原理和实现方法,还提供了大量的实例和程序代码,读者可以结合代码进行实际操作和练习。书中的示例代码都是用C语言实现的,非常简洁明了,容易理解和掌握。 此外,本书还介绍了一些经典的算法问题和解决方案,如最大子序列和、最短路径、背包问题等。这些问题是算法设计中的经典案例,通过学习这些问题及其解决方法,读者可以提高自己的算法设计能力。 总的来说,《常用算法程序集(C语言描述)第版》是一本非常实用的算法教材。无论是初学者还是有一定编程经验的人,都可以通过这本书系统地学习和掌握常用算法和数据结构。读者可以根据自己的需求选择性地阅读书中的内容,提高自己的算法编程能力。 ### 回答2: 《常用算法程序集(C语言描述)第版》是徐士良编写的一本关于常用算法的书籍。本书主要介绍了常见的算法和数据结构,并给出了用C语言实现的描述和示例代码。 这本书的主要内容包括排序算法、查找算法、串的模式匹配算法、图论算法、动态规划算法等。每个算法都从基本原理出发,详细介绍了其思想和实现方法,并给出了相应的C语言代码。通过学习本书,读者可以深入理解各种算法的工作原理和实现细节,掌握算法设计的基本思想和技巧。 此外,本书还特别介绍了一些常用的数据结构,如线性表、栈、队列、树、图等。对于每种数据结构,书中讲解了其定义、基本操作和常见应用,并给出了相应的C语言代码。 《常用算法程序集(C语言描述)第版》在编写上注重通俗易懂的风格,尽可能避免使用过于复杂的数学推导和专业术语,适合各个层次的读者阅读和学习。此外,书中还穿插了一些实际问题的案例分析,帮助读者更好地理解算法的应用场景和解决方法。 总的来说,《常用算法程序集(C语言描述)第版》是一本全面介绍常用算法和数据结构的书籍。它不仅适合作为算法和数据结构课程的教材,也适合作为算法工程师的参考书。无论是计算机科学专业的学生,还是从事软件开发工作的人员,都可以通过学习这本书,提升自己的算法设计与实现能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值