回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束。

与贪心算法不同的是,回溯算法理论上是可以得到最优解,而贪心算法则尽可能在快的情况下得到较理想的结果。

一、八皇后

下面的栗子就是八皇后问题,是一个典型的回溯算法应用栗子。其实本质上就是遍历所有的可能性,最后满足条件者打印出来。

#include <iostream>unsigned int g_count = 0;bool isOK(unsigned char *p_result, const unsigned char &row, const unsigned char &column);
void PrintResult(unsigned char *p_result);
void Calc8Queens(unsigned char *p_result, const unsigned char &row);int main()
{unsigned char result[8] = {5, 5, 5, 5, 5, 5, 5, 5};Calc8Queens(result, 0);std::cout << "共有 " << g_count << " 个结果" << std::endl;return 0;
}bool isOK(unsigned char *p_result, const unsigned char &row, const unsigned char &column)
{if (p_result == nullptr)return false;unsigned char leftup = column - 1;unsigned char rightup = column + 1;for (int i = row - 1; i >= 0; --i){if (p_result[i] == column)return false;if (leftup >= 0){if (p_result[i] == leftup)return false;}if (rightup < 8){if (p_result[i] == rightup)return false;}leftup--;rightup++;}return true;
}void PrintResult(unsigned char *p_result)
{if (p_result == nullptr)return;for (unsigned char i = 0; i < 8; ++i){for (unsigned char k = 0; k < p_result[i]; ++k)std::cout << "-"<< " ";std::cout << "a"<< " ";for (unsigned char k = p_result[i] + 1; k < 8; ++k)std::cout << "-"<< " ";std::cout << std::endl;}std::cout << std::endl;std::cout << std::endl;return;
}void Calc8Queens(unsigned char *p_result, const unsigned char &row)
{if (p_result == nullptr)return;if (row >= 8){g_count++;PrintResult(p_result);return;}for (int column = 0; column < 8; ++column){if (isOK(p_result, row, column)){p_result[row] = column;Calc8Queens(p_result, row + 1);}}return;
}

结果太多了,就不写出来了,共有 92 个可能性。

二、0 - 1 背包

#include <iostream>unsigned int g_max = 0;
void func(const int &index, const int &cw, const int *const pitems, const int &count, const int &maxW);int main()
{int items[10] = {80, 20, 90, 9, 50, 6, 70, 8, 9, 10};func(0, 0, items, 10, 111);std::cout << "所能容纳的最大的物件重量为 " << g_max << std::endl;return 0;
}void func(const int &index, const int &cw, const int *const pitems, const int &count, const int &maxW)
{if (cw == maxW || index >= count){if (cw > g_max)g_max = cw;return;}func(index + 1, cw, pitems, count, maxW);if (cw + pitems[index] <= maxW)func(index + 1, cw + pitems[index], pitems, count, maxW);return;
}

结果为 110 。

(SAW:Game Over!)

数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)相关推荐

  1. 【Java数据结构与算法】第五章 递归、迷宫回溯和八皇后问题

    第五章 递归 文章目录 第五章 递归 一.递归 1.概念 2.代码实现 3.递归的规则 二.迷宫回溯 1.要求 2.代码实现 三.八皇后问题 1.介绍 2.思路 3.代码实现 一.递归 1.概念 简单 ...

  2. 【算法】递归|迷宫回溯问题|八皇后问题

    [算法]递归|迷宫回溯问题|八皇后问题   迷宫回溯问题,要用动态的眼光来看待这个递归算法. package com.serein.recursion;/*** @author baichuan* @ ...

  3. 回溯java算法_聊聊算法——回溯算法

    "递归只应天上有,迭代还须在人间",从这句话我们可以看出递归的精妙,确实厉害,递归是将问题规模逐渐减小, 然后再反推回去,但本质上是从最小的规模开始,直到目标值,思想就是数学归纳法 ...

  4. 算法:递归-八皇后问题(回溯算法)

    1.问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯・贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不 ...

  5. PHP实现八皇后算法-回溯算法

    回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索,以 ...

  6. 高级数据结构与算法 | 回溯算法(Back Tracking Method)

    文章目录 回溯 电话号码的字母组合 二进制手表 组合总数 全排列 活字印刷 N皇后 N皇后II 回溯 回溯是一种通过穷举所有可能情况来找到所有解的算法.如果一个候选解最后被发现并不是可行解,回溯算法会 ...

  7. 数据结构与算法分析 ——回溯算法之收费公路重建问题

    数据结构与算法分析第十章回溯算法之收费公路重建问题 一.  问题描述: 设给定N个点p1, p2,-,pn,它们位于x-轴上.xi是pi点的x坐标.这N个点确定了N(N-1)/2个点间距离.显然,如果 ...

  8. 递归/回溯:八皇后问题N-Queens

    N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...

  9. 递归回溯解决八皇后问题

    文章目录 前言 八皇后问题 问题解析 代码实现 完整代码 前言 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇 ...

最新文章

  1. 获取多台主机命令执行结果
  2. 十四、深入Python条件和循坏
  3. Buildroot构建指南——Linux内核
  4. Acwing 276. I-区域
  5. [计算机网络] - HTTP、HTTPS
  6. 上dj是什么意思_火花塞上的每个编码是什么意思
  7. API Guides Contacts Provider (二)
  8. 聊聊泰国的工作和生活
  9. ubuntu16.04部署开源看板项目wekan(非docker部署)
  10. 微信小程序 公证号 根据code获取openid
  11. 蜀山前传之二---------------第八回
  12. 请问如何让路由器信号增强
  13. 最小二乘法理解与应用
  14. 《算法笔记》胡凡第二章笔记
  15. KVM虚拟机系统迁移
  16. ChatGPT接入微信公众号(手把手教学)
  17. Android-回传数据(装备选择)
  18. Postgres 数据存储位置
  19. 云服务AppId或AppKey和AppSecret生成策略(对外接口使用)
  20. 【pwn】攻防世界 pwn新手区wp

热门文章

  1. Unable to simultaneously satisfy constraints.
  2. iPhoneUI元素的大小
  3. NHibernate教程2(转载)
  4. 软件测试BUG参考标准
  5. MFC中如何让一个CStatic控件响应消息
  6. SpringBoot整合MyBatis-Plus分页查询
  7. SpringBoot异常处理ErrorController详解
  8. flume数据采集:js埋点
  9. k8s控制器controller(Deployment)示例:通过命令生成deployment和service的yaml文件
  10. linux命令使用示例:查看某目录属于哪个分区