数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)
回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束。
与贪心算法不同的是,回溯算法理论上是可以得到最优解,而贪心算法则尽可能在快的情况下得到较理想的结果。
一、八皇后
下面的栗子就是八皇后问题,是一个典型的回溯算法应用栗子。其实本质上就是遍历所有的可能性,最后满足条件者打印出来。
#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 背包)相关推荐
- 【Java数据结构与算法】第五章 递归、迷宫回溯和八皇后问题
第五章 递归 文章目录 第五章 递归 一.递归 1.概念 2.代码实现 3.递归的规则 二.迷宫回溯 1.要求 2.代码实现 三.八皇后问题 1.介绍 2.思路 3.代码实现 一.递归 1.概念 简单 ...
- 【算法】递归|迷宫回溯问题|八皇后问题
[算法]递归|迷宫回溯问题|八皇后问题 迷宫回溯问题,要用动态的眼光来看待这个递归算法. package com.serein.recursion;/*** @author baichuan* @ ...
- 回溯java算法_聊聊算法——回溯算法
"递归只应天上有,迭代还须在人间",从这句话我们可以看出递归的精妙,确实厉害,递归是将问题规模逐渐减小, 然后再反推回去,但本质上是从最小的规模开始,直到目标值,思想就是数学归纳法 ...
- 算法:递归-八皇后问题(回溯算法)
1.问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯・贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不 ...
- PHP实现八皇后算法-回溯算法
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索,以 ...
- 高级数据结构与算法 | 回溯算法(Back Tracking Method)
文章目录 回溯 电话号码的字母组合 二进制手表 组合总数 全排列 活字印刷 N皇后 N皇后II 回溯 回溯是一种通过穷举所有可能情况来找到所有解的算法.如果一个候选解最后被发现并不是可行解,回溯算法会 ...
- 数据结构与算法分析 ——回溯算法之收费公路重建问题
数据结构与算法分析第十章回溯算法之收费公路重建问题 一. 问题描述: 设给定N个点p1, p2,-,pn,它们位于x-轴上.xi是pi点的x坐标.这N个点确定了N(N-1)/2个点间距离.显然,如果 ...
- 递归/回溯:八皇后问题N-Queens
N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...
- 递归回溯解决八皇后问题
文章目录 前言 八皇后问题 问题解析 代码实现 完整代码 前言 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇 ...
最新文章
- 获取多台主机命令执行结果
- 十四、深入Python条件和循坏
- Buildroot构建指南——Linux内核
- Acwing 276. I-区域
- [计算机网络] - HTTP、HTTPS
- 上dj是什么意思_火花塞上的每个编码是什么意思
- API Guides Contacts Provider (二)
- 聊聊泰国的工作和生活
- ubuntu16.04部署开源看板项目wekan(非docker部署)
- 微信小程序 公证号 根据code获取openid
- 蜀山前传之二---------------第八回
- 请问如何让路由器信号增强
- 最小二乘法理解与应用
- 《算法笔记》胡凡第二章笔记
- KVM虚拟机系统迁移
- ChatGPT接入微信公众号(手把手教学)
- Android-回传数据(装备选择)
- Postgres 数据存储位置
- 云服务AppId或AppKey和AppSecret生成策略(对外接口使用)
- 【pwn】攻防世界 pwn新手区wp