回溯算法(Backtracking Algorithm)之八皇后问题

文章目录

    • 1. 回溯算法思想
    • 2. 算法应用
      • 2.1 八皇后问题

1. 回溯算法思想

前面讲过贪心算法并不能保证得到最优解,那怎么得到最优解呢?

  • 回溯思想,有点类似枚举搜索。枚举所有的解,找到满足期望的解。
  • 为了有规律地枚举所有可能的解,避免遗漏和重复,把问题求解的过程分为多个阶段。
  • 每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。

2. 算法应用

2.1 八皇后问题

有一个8×8的棋盘,希望往里放8个棋子(皇后),每个棋子所在的行、列、对角线都不能有另一个棋子。请找到所有满足这种要求的放棋子方式。

在这里插入图片描述

  • 把这个问题划分成8个阶段,依次将8个棋子放到第一行、第二行、第三行。。。第八行
  • 放置的过程中,不停地检查当前的方法,是否满足要求
  • 如果满足,则跳到下一行继续放置棋子
  • 如果不满足,那就再换一种方法,继续尝试
  • 如果一整行都不能放下一颗,那么这种方法无效,退到上一行,上一行列位置+1,再往下尝试

在这里插入图片描述
从(0,0)位置开始放置
在这里插入图片描述
下标5的行,走到最后也没有放下这颗棋子,都不满足,那么退到下标4的行,列位置+1,从4列开始新的尝试
在这里插入图片描述
在这里插入图片描述
下标5的行容不下一颗棋子,再次回退,下标4行退到最后了,再往上退,下标3行棋子往右挪
在这里插入图片描述
在这里插入图片描述
下标7行放不下,退到6行
在这里插入图片描述
6行也容不下棋子,接着看5行
在这里插入图片描述
5行也不可以容下棋子,看第4行。。。(第一种可行解怎么还没出来,好累,就到这里吧,大家自行 ppt 画个图配合代码推一下就理解了)
在这里插入图片描述
第一个解是这样的,哈哈,挪了好长时间终于出来了
在这里插入图片描述

/*** @description: 回溯算法--八皇后问题* @author: michael ming* @date: 2019/7/7 0:10* @modified by: */
#include <iostream>
using namespace std;
class EightQueen
{int result[8];//下标表示行,值表示queen在哪一列void printQueens(int *result){int i,r,c,flag = 1;cout << "  ";for(i = 0; i < 8; ++i)cout << "▁";cout << endl;for(r = 0; r < 8; ++r){cout << "┃";for(c = 0; c < 8; ++c){if(result[r] == c)cout << "★";else{if(flag < 0)cout << "  ";elsecout << "■";}flag = -1*flag;}cout << "▏" << endl;flag = -1*flag;}cout << "  ";for(i = 0; i < 8; ++i)cout << "▔";cout << endl;}bool isOk(int r, int c)//判断在r行c列放置是否可以满足要求{int leftup = c - 1, rightup = c + 1;for(int i = r - 1; i >= 0; --i)//逐行向上考察每一行{if(result[i] == c)//第i行的c列有棋子吗return false;if(leftup >= 0)//考察左上对角线{if(result[i] == leftup)//第i行leftup列有棋子吗return false;}if(rightup < 8)//考察右上对角线{if(result[i] == rightup)//第i行rightup列有棋子吗return false;}--leftup; ++rightup;}return true;}
public:int kinds;  //可行布局种类EightQueen():kinds(0){}void cal8queens(int row)    //调用方式cal8queens(0){if(row == 8)    //8个棋子都放置好了,打印结果{kinds++;cout << "第" << kinds << "种放法:" << endl;printQueens(result);return;//都放置好了,没法再递归了}for(int column = 0; column < 8; ++column)//每行有8种放法{if(isOk(row,column))    //该放法满足要求{result[row] = column;//第row行的棋子放到了column列cal8queens(row+1);  //考察下一行}}}};
int main()
{EightQueen eq;eq.cal8queens(0);cout << "共有" << eq.kinds << "种摆放方法。" << endl;return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

在Java并发场景中&#xff0c;会涉及到各种各样的锁&#xff0c;比如&#xff1a;高并发编程系列&#xff1a;4种常用Java线程锁的特点&#xff0c;性能比较、使用场景&#xff0c;这些锁有对应的种类&#xff1a;公平锁&#xff0c;乐观锁&#xff0c;悲观锁等等&#xff0c;这…

论文浅尝 | Generative QA: Learning to Answer the Whole Question

链接: https://openreview.net/forum?idBkx0RjA9tX传统的机器阅读理解的模型都是给定 context 和 question, 找出最有可能回答该 question 的 answer&#xff0c;用概率表示为 p(a|q,c)&#xff0c;这其实是一个判别模型。判别模型在大多数任务上可以取得比生成模型更好的准确…

打破BERT天花板:11种花式炼丹术刷爆NLP分类SOTA!

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | JayLou娄杰编 | 小轶在2020这个时间节点&#xff0c;对于NLP分类任务&#xff0c;我们的关注重点早已不再是如何构造模型、拘泥于分类模型长什么样子了。如同CV领域当前的重点一样&#xff0c;我们更应该…

论文笔记(A Neural Influence Diffusion Model for Social Recommendation)

神经影响传播模型为了社交推荐 原文链接&#xff1a;A Neural Influence Diffusion Model for Social Recommendation, SIGIR’19 原理&#xff1a;社交网络上应用GNN提取朋友对用户的影响候选项对用户历史交互项的注意力影响用户向量&#xff0c;用户向量和项向量的内积预测评…

玩转算法面试-第三章

数组中常见的问题 排序&#xff1a; 选择排序&#xff1b;插入排序&#xff1b;归并排序&#xff1b;快速排序 查找&#xff1a;二分查找法 数据结构&#xff1a;栈&#xff1b;队列&#xff1b;堆 … 二分查找法&#xff1a; 1964年提出&#xff0c;没有bug的二分查找法是在1…

回溯应用-- 0-1背包问题

文章目录1. 问题描述2. 回溯解决思路1. 问题描述 0-1背包非常经典&#xff0c;很多场景都可以抽象成这个问题。经典解法是动态规划&#xff0c;回溯简单但没有那么高效。 有一个背包&#xff0c;背包总的承载重量是 W kg。现有n个物品&#xff0c;每个物品重量不等&#xff0…

Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现

为什么需要线程池 我们有两种常见的创建线程的方法&#xff0c;一种是继承Thread类&#xff0c;一种是实现Runnable的接口&#xff0c;Thread类其实也是实现了Runnable接口。但是我们创建这两种线程在运行结束后都会被虚拟机销毁&#xff0c;如果线程数量多的话&#xff0c;频繁…

论文浅尝 | 面向单关系事实问题的中文问答模型

来源&#xff1a;NLPCC 2017论文下载地址&#xff1a;http://tcci.ccf.org.cn/conference/2017/papers/2003.pdf动机开放领域的QA问题是一个被广泛研究的问题&#xff0c;而且目前这个问题并没有被很好地解决。在中文领域&#xff0c;相关的数据集并不多。而NLPCC开放了一个KBQ…

玩转算法值面试-第五章 -在链表中穿针引线

5-123 数组中可以随机访问&#xff0c;相反链表就不行 leetcode&#xff1a;206 反转一个链表&#xff0c;链表如果没有特别声明&#xff0c;则节点的值不发生改变 一共需要三个指针&#xff1a;current指向当前需要处理的指针 next指向当前需要处理的元素的下一个元素的指针…

论文笔记(SocialGCN: An Efficient Graph Convolutional Network based Model for Social Recommendation)

一个有效的基于图卷积神经网络的社交推荐模型 原文链接&#xff1a;SocialGCN: An Efficient Graph Convolutional Network based Model for Social Recommendation, arxiv 原理&#xff1a;在用户-项交互图上应用GNN来学习用户向量的表示&#xff0c;用户向量和项向量内积预测…

POJ 1753 Flip Game(回溯)

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. 代码2.1 Wrong Answer代码2.2 Accepted代码1. 题目 1.1 题目链接 http://poj.org/problem?id1753 1.2 题目大意 一个黑白棋子的棋盘&#xff0c;一个反过来周围四个也跟着反过来(如果存在的话)&#xff0c;颜色取反…

他读书时挣了五十万,找工作时收获阿里腾讯快手等ssp offer

今天介绍一位dalao&#xff0c;他之前在中科院获取了计算机硕士学位&#xff0c;现在是一名大厂的算法工程师。大多数人的学生生活&#xff0c;是在枯燥的课程和任务中度过的&#xff0c;但他却有所不同&#xff0c;乐于折腾&#xff0c;收获了不一样的精彩。他喜欢去公司实习&…

Java多线程系列(三):Java线程池的使用方式,及核心运行原理

之前谈过多线程相关的4种常用Java线程锁的特点&#xff0c;性能比较、使用场景&#xff0c;今天主要分享线程池相关的内容&#xff0c;这些都是属于Java面试的必考点。 为什么需要线程池 java中为了提高并发度&#xff0c;可以使用多线程共同执行,但是如果有大量线程短时间之内…

论文浅尝 | 图神经网络综述:方法及应用

论文链接&#xff1a;https://arxiv.org/pdf/1812.08434.pdfGNN相关论文列表链接&#xff1a;https://github.com/thunlp/GNNPapers近日&#xff0c;清华刘知远老师组在arXiv上发表了一篇关于图神经网络的综述&#xff0c;本次论文浅尝在分享这篇论文的基础上&#xff0c;对图神…

论文笔记(Social Attentional Memory Network:Modeling Aspect- and Friend-level Differences in Recom-)

社交注意记忆网络&#xff1a;模拟面级别和朋友级别的区别 原文链接&#xff1a;Social Attentional Memory Network: Modeling Aspect- and Friend-Level Differences in Recommendation, WSDM’19 1. 摘要 社会中的连接有助于提升推荐系统的性能&#xff0c;但是&#xff…

玩转算法之面试-第六章(栈和队列)

leetcode 20 此时栈顶的左括号和当前遍历的右括号匹配&#xff0c;故将左括号从栈顶pop出。 leetcode 150&#xff1a; leetcode 71 栈和递归的关系 递归算法&#xff1a;二叉树中的算法 、二叉树的前序遍历&#xff0c;中序遍历&#xff0c;后序遍历 前序遍历代码&am…

POJ 1321 棋盘问题(回溯)

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. 代码2.1 Accepted 代码1. 题目 1.1 题目链接 http://poj.org/problem?id1321 1.2 题目大意 在一个给定形状的棋盘&#xff08;只能在#号的位置摆放&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任…

Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

在Java面试的时候&#xff0c;经常会问到Java并发编程相关的多线程、线程池、线程锁、线程通信等面试必考点&#xff0c;比如&#xff1a; Java并发编程系列&#xff1a;Java线程池的使用方式&#xff0c;核心运行原理、以及注意事项 Java并发编程系列&#xff1a;4种常用Jav…

负样本为王:评Facebook的向量召回算法

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术有人的地方就会有江湖&#xff0c;就会有鄙视链存在&#xff0c;推荐系统中也不例外。排序、召回&#xff0c;尽管只是革命分工不同&#xff0c;但是我感觉待遇还是相差蛮大的排序排序&#xff0c;特别是精排…

论文浅尝 | TEQUILA: 一种面向时间信息的知识问答方法

来源&#xff1a;CIKM’18链接&#xff1a;http://delivery.acm.org/10.1145/3270000/3269247/p1807-jia.pdf?ip223.3.116.39&id3269247&accACTIVE%20SERVICE&keyBF85BBA5741FDC6E%2EEEBE655830483280%2E4D4702B0C3E38B35%2E4D4702B0C3E38B35&__acm__15478819…