图Graph--农夫过河问题(BFS/DFS应用)

农夫过河问题:
在这里插入图片描述

/*** @description: 农夫过河问题(羊,白菜,狼),一次最多带一个东西过河,*                  农夫不在的情况下羊会吃白菜,狼会吃羊,如何平安过河* @author: michael ming* @date: 2019/6/13 20:06* @modified by: */
#include <iostream>
#include <queue>
#include <memory.h>#define MaxVertexNum 10 //最多10种情况(顶点)
using namespace std;
struct vertexType
{int farmer;int wolf;int sheep;int vegetable;
};
class MGraph_Farmer //邻接矩阵图类
{
public:vertexType vertex[MaxVertexNum];    //顶点表int edges[MaxVertexNum][MaxVertexNum];//边的邻接矩阵int vN, eN;   //顶点和边的数量int visited[MaxVertexNum];  //访问标志int prev[MaxVertexNum];     //存储搜索路径MGraph_Farmer():vN(0),eN(0){memset(visited,0, sizeof(int)*MaxVertexNum);}void clearPrev(){for(int i = 0; i < MaxVertexNum; ++i)prev[i] = -1;}int findPos(int F, int W, int S, int V)//查找顶点在图中的位置{for(int i = 0; i < vN; ++i)if(vertex[i].farmer == F && vertex[i].wolf == W &&vertex[i].sheep == S && vertex[i].vegetable == V)return i;return -1;}int is_safe(int F, int W, int S, int V)//判断是否安全{if(F != S && (W == S || S == V))//人和羊不在一起时,狼羊或者羊菜在一起,不安全return 0;return 1;}int is_connected(int i, int j)//判断状态之间是否可以转换{int k = 0;if(vertex[i].wolf != vertex[j].wolf)k++;if(vertex[i].sheep != vertex[j].sheep)k++;if(vertex[i].vegetable != vertex[j].vegetable)k++;if(vertex[i].farmer != vertex[j].farmer && k <= 1)//农夫每次需要过河,只能带一件东西return 1;return 0;}void creatGraph()//建立图的存储矩阵{int i = 0, j, F, W, S, V;for(F = 0; F <= 1; F++)//生成所有安全状态的顶点for(W = 0; W <= 1; W++)for(S = 0; S <= 1; S++)for(V = 0; V <= 1; V++)if(is_safe(F, W, S, V)){vertex[i].farmer = F;vertex[i].wolf = W;vertex[i].sheep = S;vertex[i].vegetable = V;i++;}vN = i;//安全顶点个数for(i = 0; i < vN; ++i)for(j = 0; j < vN; ++j)if(is_connected(i,j))//i,j两种状态可以转换,他们的边置1,否则置0{edges[i][j] = edges[j][i] = 1;//无向图eN++;}elseedges[i][j] = edges[j][i] = 0;//无向图eN /= 2;}void dfs(int s, int t){memset(visited,0, sizeof(int)*MaxVertexNum);clearPrev();dfs_path(s, t);if(visited[t])printPath(s,t,t);}void dfs_path(int s, int t)//dfs搜索s到t的路径{int j;visited[s] = true;for(j = 0; j < vN; ++j)if(edges[s][j] == 1 && !visited[j] && !visited[t]){prev[j] = s;//记录路径dfs_path(j, t);}}void printPath(int s, int t, int k){if(k != s){printPath(s,t,prev[k]);}cout << endl;cout << "(" << vertex[k].farmer << vertex[k].wolf<< vertex[k].sheep << vertex[k].vegetable << ")";}void bfs(int s, int t)//bfs搜索s到t的路径{memset(visited,0, sizeof(int)*MaxVertexNum);clearPrev();queue<int> q;q.push(s);visited[s] = true;int j, w;while(!q.empty()){int w = q.front();q.pop();for(j = 0; j < vN; ++j){if(edges[w][j] == 1 && !visited[j]){prev[j] = w;if(j == t){printPath(s,t,j);return;}visited[j] = true;q.push(j);}}}}
};int main()
{int s, t;MGraph_Farmer farmerCrossRiver;farmerCrossRiver.creatGraph();s = farmerCrossRiver.findPos(0,0,0,0);t = farmerCrossRiver.findPos(1,1,1,1);cout << "dfs搜索:";farmerCrossRiver.dfs(s,t);cout << endl << "bfs搜索:";farmerCrossRiver.bfs(s,t);return 0;
}

在这里插入图片描述

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

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

相关文章

机器学习之「二分类算法」-----银行营销案例分析

原文地址&#xff1a; <di&#xff1a;https://blog.csdn.net/weixin_44696674/article/details/88231922iv id“article_content” class“article_content clearfix” data-track-view"{“mod”:“popu_307”,“con”:",https://blog.csdn.net/weixin_44696674/…

论文浅尝 | 直译优于翻译?混合语言的知识库问答方法研究

动机作者思考&#xff0c;如果一个人懂多个语言&#xff0c;那么只要他知道某一语言的某个事实&#xff0c;就能以它作为另一语言问题的答案&#xff0c;同时希望证明计算机是否也能做到这一点&#xff0c;并完成混合语言的简单问题知识问答任务&#xff08;Code-Mix Simple Qu…

2018最新Java面试78题:数据结构+网络+NoSQL+分布式架构

算法和数据结构 数组、链表、二叉树、队列、栈的各种操作&#xff08;性能&#xff0c;场景&#xff09; 二分查找和各种变种的二分查找 各类排序算法以及复杂度分析&#xff08;快排、归并、堆&#xff09; 各类算法题&#xff08;手写&#xff09; 理解并可以分析时间和空…

工程实践:基于规则模式的军事和医药领域知识图谱问答快速实现

知识结构化问答是知识图谱的一个重要的应用方向&#xff0c;虽然现在许多真实的使用体验上&#xff0c;会被评价为“鸡肋且智障”&#xff0c;并且在落地上还没有太多的付费场景&#xff0c;但也不乏有不少学生、公司、机构在尝试花时间去做这个事情。当前&#xff0c;医疗知识…

图Graph--最小生成树

文章目录1.概念2.构造最小生成树Prim算法3.构造最小生成树Kruskal算法1.概念 对图运用不同的遍历方法就可能得到图的不同遍历顺序&#xff0c;每一种遍历顺序对应于一棵生成树对于无向连通图&#xff0c;所有的生成树中必有一棵树的所有边的权的总和最小的&#xff0c;称之为最…

Longformer:超越RoBERTa,为长文档而生的预训练模型

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | ChrisCao, 小轶前言今天要与大家分享的是AllenAI今年发表的最新工作&#xff0c;Longformer——一种可高效处理长文本的升级版Transformer。作者团队提供了开源代码&#xff0c;大家可快速复现&#xff…

工程实践:基于规则句法的事件关系与主谓宾三元组抽取项目实现

目前&#xff0c;知识图谱在学术界如火如荼地进行&#xff0c;但受限于知识图谱各个环节中的性能问题&#xff0c;还尚未能够在工业界大规模运用。而与知识图谱中以实体为知识节点&#xff0c;实体关系为实体关系边对知识进行组织不同&#xff0c;以事件作为节点&#xff0c;事…

论文浅尝 | LightRNN:存储和计算高效的 RNN

链接&#xff1a;https://arxiv.org/pdf/1610.09893.pdf动机在NLP任务中使用RNN已经被证明是很有用的模型方法。但是传统的RNN在NLP中的应用有一个很大的限制&#xff1a;RNN的输出输入Embedding占用的空间太大&#xff0c;比如1024维10M词表大小的Embedding矩阵就要占掉40GB&a…

阿里最全Java面试100题汇总:涵盖天猫、蚂蚁金服等面试题!含答案~

【阿里天猫、蚂蚁、钉钉面试题目】 1、微信红包怎么实现。 2、海量数据分析。 3、测试职位问的线程安全和非线程安全。 4、HTTP2.0、thrift。 5、面试电话沟通可能先让自我介绍。 6、分布式事务一致性。 7、nio的底层实现。 8、jvm基础是必问的&#xff0c;jvm GC原理&a…

ACL2020 奇葩论文标题大赏

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 灵魂写手rumor酱编 | 不拖更的夕小瑶又是一年一度的ACL&#xff0c;之前通过卖萌屋Arxiv服务已经零零碎碎看了一些&#xff0c;还是准备刷一下论文list&#xff0c;看看哪篇能让我的模型效果一飞冲天。…

字符串匹配算法(BF RK)

文章目录1. BF&#xff08;Brute Force&#xff09;暴力匹配BF代码2. RK&#xff08;Rabin-Karp&#xff09;算法RK代码3. 思考题&#xff1a;&#xff08;二维匹配&#xff09;1. BF&#xff08;Brute Force&#xff09;暴力匹配 BF算法的思想&#xff0c;在主串中&#xff0…

用Python寻找最优投资组合

原文地址&#xff1a;https://www.jianshu.com/p/2a25dfd465e9 现代投资组合理论&#xff08;Modern Portfolio Theory&#xff0c;MPT&#xff09;告诉我们投资者应该分散投资来实现最小化风险最大化投资回报。大邓刚开始学习这方面知识&#xff0c;用了将近一天的时候才搞懂M…

技术动态 | 事理图谱,下一代知识图谱

本文转载自公众号&#xff1a;DataHorizon。 人工智能与认知智能当前人工智能时代下&#xff0c;机器与人类之间的博弈一直在进行着。如图1所示&#xff0c;从1926年达特茅斯会议的召开标志人工智能诞生到深度学习模型在…

头条Java后台3面(含答案):事务+List集合+慢查询SQL+Redis+秒杀设计

头条Java一面 1.讲讲jvm运行时数据库区 2.讲讲你知道的垃圾回收算法 3.jvm内存模型jmm 4.内存泄漏与内存溢出的区别 5. select、epoll 的区别&#xff1f;底层的数据结构是什么&#xff1f; 6.mysql数据库默认存储引擎&#xff0c;有什么优点 7.优化数据库的方法&#xf…

CNN卷积神经网络(吴恩达《卷积神经网络》笔记一)

CNN 卷积网络说明卷积 Convolution填充 Padding步长 StrideRGB图像卷积池化 Pooling完整CNN为什么人们喜欢用卷积神经网络&#xff1f;实例分析说明 关于CNN的基础知识&#xff1a;卷积、填充、步长、池化、完整的深度CNN网络可以参考 链接: AI学习笔记——卷积神经网络&#…

字符串匹配算法(BM)

文章目录1. BM&#xff08;Boyer-Moore&#xff09;算法1.1 坏字符规则1.2 好后缀规则1.3 两种规则如何选择2. BM算法代码实现2.1 坏字符2.2 好后缀2.3 完整代码2.4 调试3. 总结1. BM&#xff08;Boyer-Moore&#xff09;算法 思想&#xff1a;有模式串中不存在的字符&#xf…

SQL 数据分析常用语句

1 基础查询 • 2 字符串数字日期时间 • 3 聚合数据查询 • 4 子查询 • 5 联接组合查询 • 6 高级查询 • 7 更新数据 阅读提醒&#xff1a;点击图片放大可看清晰的 1 基础查询 2 字符串数字日期时间 3 聚合数据查询 4 子查询 5 联接组合查询 6 高级查询 7 更新数据 参考资料 …

开源词法分析工具LAC重大升级!打造属于自己的个性化分词器!

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 匿名大佬编 | 北大小才女小轶本文将为大家介绍如何使用百度开源的词法分析工具LAC实现个性化分词&#xff08;附代码&#xff09;&#xff0c;并展示LAC在各数据集上惊艳的性能表现。背景介绍分词是中文…

老刘说NLP:这几年的NLP历程回顾,以及关于NLP(知识图谱等)落地的思考

得语言者&#xff0c;得天下。得语言资源者&#xff0c;分天下。得语言逻辑者&#xff0c;争天下。 前言 只有把自己所思考的&#xff0c;所认识的东西&#xff0c;以文字的方式记录下来&#xff0c;才是对自己成长最好的记录方式。 是的&#xff0c;距离上一次动手写博客或者…

Redis系列教程(一):Redis缓存的设计、性能、应用与数据集群同步

Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库。Redis本质上是一个Key-Value类型的内存数据库&#xff0c;很像memcached&#xff0c;整个数据库统统加载在内存当中进行操作&#xff0c;定期通过异步操作把数据库数据flush到硬盘上…