• 数据结构-回溯法-C++代码


    人都会误以为自己特立独行 其实没有 你周围人是什么样
    你就会变成什么样 只会更变本加厉 甚至变成你最讨厌的人的样子 (所以要保持积极向上,不同流合污)
    但似乎每个人都觉得自己善良 勇敢 有梦想 去远方 不是的
    大多数人都只是把这些词汇当作平庸生活的浓缩营养药片
    真正风雨兼程低头走路的人 并不在乎它叫旅行或者流浪

    一、

    • 应用:满足一定约束条件的所有解或最优解都可用回溯法,其称之为“通用解题法”

    • 将问题转化为图或树的结构表示,然后使用深度优先搜索策略进行遍历,遍历过程中记录和寻找所有可行解或最优解。

    • 基本思想类似于:

      • 深度优先搜索
      • 二叉树后序遍历
    • 过程描述:

      • 按照深度优先搜索解空间树,若搜索到某一点,利用剪枝函数判断节点是否可行,不可行则跳过对该节点为根的子树搜索,逐层向祖先节点回溯;否则,进入该子树,继续按照深度优先策略搜索。
    • 剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2. 使用限界函数,剪去不能得到最优解的路径。

    • 解空间树分为两种:子集树和排列树。两种在算法结构和思路上大体相同。

    二、实现-递归和递推(迭代)

    • 递归和递推都可以实现,但递归实现简单,效率低;递推实现复杂,效率高。

    三、经典问题

    (1)装载问题
    (2)01背包问题
    (3)旅行售货员问题
    (4)八皇后问题
    (5)迷宫问题
    (6)图的m着色问题

    (1)八皇后问题算法及代码-递推
    • 如何实现剪枝的?
      • 利用递归循环,如果该层循环满足条件,则进入下一行元素的选择;如果该行所有列元素都遍历完毕没有发现合适的,则将该行标志数组对应元素置0后,自动回退到上一个循环。
    void eight_queen(int index)
    {
    	for (int col = 0; col < N; col++)//负责每一行中列的选择
    	{
    		if (check_out(index, col))
    		{
    			get_eight_queen[index] = col;
    			if(7==index)
    			{
    				get_count++;
    				get_eight_queen[index] = 0;//满足条件后,将该对应元素置0后回退到上一级。
    				print();
    				return;			
    			}
    			eight_queen(index + 1);//每一次执行,都输出第一行为该列时所对应的全部可能排布。
    			get_eight_queen[index] = 0;
    		}	
    	}
    }
    
    • 如何判断是否符合条件的?
      • 自己想是很困难的,原来判断也是有规律可循的。即包含三个判断条件
      • (1)新加的列与已添加的所有列都不同;
      • (2)新加的列以及其所在的行的和与已添加的所有元素对应的行列值之和都不能相等;
      • (3)新加的列以及其所在的行的差与已添加的所有元素对应的行列值之差都不能相等
      • 以上满足任一条件就返回0.
    (2)全部代码
    #include<iostream>
    using namespace std;
    #define N 8
    static int get_eight_queen[N] = { 0 }, get_count = 0;
    //输出
    void print()
    {
    	for (int i = 0; i < N; i++)
    	{
    		for (int j = 0; j < get_eight_queen[i]; j++)
    		{
    			cout << "0";
    		}
    		cout << "*";
    		for (int j = (get_eight_queen[i]+1); j < N; j++)
    		{
    			cout << "0";
    		}
    		cout << endl;
    	}
    	cout << "====================================================================" << endl;
    }
    //判断
    bool check_out(int row_num, int column)
    {
    	for (int i = 0; i < row_num; i++)
    	{
    		int data = get_eight_queen[i];
    		if (data == column)
    		{
    			return 0;
    		}
    		if ((i + data) == (row_num + column))
    		{
    			return 0;
    		}
    		if ((i - data) == (row_num - column))
    		{
    			return 0;
    		}
    	}
    	return 1;
    }
    //执行
    void eight_queen(int index)
    {
    	for (int col = 0; col < N; col++)
    	{
    		if (check_out(index, col))
    		{
    			get_eight_queen[index] = col;
    			if(7==index)
    			{
    				get_count++;
    				get_eight_queen[index] = 0;
    				print();
    				return;			
    			}
    			eight_queen(index + 1);
    			get_eight_queen[index] = 0;
    		}	
    	}
    
    }
    //main
    int main()
    {
    	eight_queen(0);
    	cout << "total="<<get_count << endl;
    	return 0;
    }
    

    (2)其他问题的代码待定

    Higher you climb, more view you will see.
  • 相关阅读:
    定位小结
    定位知识点
    css属性书写顺序
    清除浮动及清除浮动的方法
    margin合并和塌陷问题
    css特性-层叠性,继承性,优先级
    css属性简写
    css布局之双飞翼布局
    css布局之圣杯布局
    css布局之等高布局
  • 原文地址:https://www.cnblogs.com/yyfighting/p/12500608.html
Copyright © 2020-2023  润新知