大概题目:蜂巢在坐标(0,0)的位置,有五处花丛,蜜蜂从蜂巢出发,要把五处花丛的花蜜采完再回到蜂巢,最短距离是多少。输入说明:一行输入,10个数分别是五处花丛的坐标(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5)

今天做华为机试题,第二题是蜜蜂采蜜的最短路径问题,脑子一热就直接想到Dijkstra最短路径算法,忙忙活活2小时写出了代码。最后运算一得答案,0。自己有点崩溃又有点想笑。Dijkstra最短路径是起点和终点最短的路线,并没有要求必须经过哪里。而此题是要求必须经过哪里。所以根本不行。时间只有半小时,估计也写不出来了,索性开始自我尝试暴力破解算法。

有两种暴力破解,第一种是改进的图。将所有情况共27个点全部画上,为什么27个点,相当于每次选择路径的选择都列出来,起点是0,然后选5条路中一条,选了五条路后又有5条路选,除开已选的,再剩下的点内再选,一直选5次,最后再到0,所以相当于是1+5*5+1=27个点,将其存储为map形式再进行Dijkstra推导,也不想画图说明这种算法了,总之实现比较麻烦,写的代码冗杂,就不贴出来了,理解不到也没关系,反正很垃圾。TT

第二种很好理解,遍历所有路径,选出最短一条。代码如下:

#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>#pragma warning(disable:4996)#define Inf 0x3f3f3f3f//无穷大值
#define Number 6//实际节点数int q[4];
//节点坐标
typedef struct node {int x;int y;double length[Number];//保存分别对应的5个点的权值大小
}node;//处理坐标
void operate(node *l) {l[0].x = l[0].y = 0;//对原点坐标初始化//获得每个点的坐标for (int i = 1; i < 6; i++)scanf("%d%d", &l[i].x, &l[i].y);//获得坐标长,即权值for (int i = 0; i < 6; i++)for (int j = 0; j < 6; j++) l[i].length[j] = sqrt((l[i].x - l[j].x)*(l[i].x - l[j].x) + (l[i].y - l[j].y)*(l[i].y - l[j].y));
}//全遍历计算最短路径
int Creatmap(node *l) {double result = Inf;double p;int temp[6];for (int i = 1; i < Number; i++) {memset(temp, 0, sizeof(int) * 6);p = 0;temp[i] = i;p = p + l[0].length[i];for (int j = 1; j < Number; j++) {if (temp[j] == 0) {temp[j] = j;p = p + l[i].length[j];for (int k = 1; k < Number; k++) {if (temp[k] == 0) {temp[k] = k;p = p + l[j].length[k];for (int r = 1; r < Number; r++) {if (temp[r] == 0) {temp[r] = r;p = p + l[k].length[r];for (int o = 1; o < Number; o++) {if (temp[o] == 0) {temp[o] = o;p = p + l[r].length[o];p = p + l[o].length[0];if (result > p) result = p;}}}}}}}}}return (int)result;
}int main() {//处理坐标,获得地图node *l=(node *)malloc(sizeof(node)*6);//指向节点的指针operate(l);//Dijkstra算法int s = Creatmap(l);//整数结果printf("%d\n", s);system("pause");return 0;
}

此题其实便是著名的旅游商问题(TSP),此问题被证明符合NPC计算复杂性。最优近似解可参照此篇:

https://blog.csdn.net/qq_41879343/article/details/89222819

https://blog.csdn.net/qq547276542/article/details/77838136

以及遗传算法等

https://www.cnblogs.com/lyrichu/p/6152928.html

发现自己还是代码写少了,算法看少了,没办法第一时间很快反应出正确的思路。脚踏实地,继续刷题。

顺便这里写下昨天刷题的笔记:

1. return结构体会导致结构体指针内容缺失!这是因为方法内的局部变量,出栈后所有栈内存都被释放,所以以后要注意。

2.数组作为实参传入是丢失了数组长度信息的,传入的仅是首地址,所以不论用sizeof或者strlen都无法获得其长度,一般做法应当在传入数组时同时传入其长度。但是当为字符数组或者字符串指针,当其末尾为'\0',strlen可以获得其长度,原理是编译器会遍历该地址直到遇见'\0'。

今天的我又是个瓜娃子。

蜜蜂采蜜最短路径(华为机考反思)(暴力破解)相关推荐

  1. 蜜蜂采蜜最短路径c语言算法,粒子群算法解最短路径.doc

    摘要 粒子群优化算法(Particle Swarm Optimization,PSO)是由美国的Eberhart和Kennedy在1995年提出的一种高效的并行优化算法.由于该算法具有深刻的智能背景, ...

  2. 蜜蜂采蜜最短路径c语言算法,S018 蜜蜂采蜜太辛苦了,编程实现还是很容易的

    原标题:S018 蜜蜂采蜜太辛苦了,编程实现还是很容易的 上节课完成了codeorg课程2的第7节的课程. 这节课学习codeorg课程2的第8节课程. 课程2第8节第1关和第2关 打开浏览器,输入网 ...

  3. 华为机考HJ13句子逆序C语言弱智解法

    华为机考HJ13句子逆序C语言弱智解法 句子逆序C语言低端解法,易于理解. 1.收数据老生常谈. 2.将句子全部逆序. 3.将单词正序. (这里有一个bug,最后一个词(原句子第一个词)总是收不到,所 ...

  4. 华为机考HJ7取近似值

    华为机考HJ7取近似值 只有小数点后一位,所以扩大十倍,让小数点后的数都为0. 然后强制转换成整型,不会影响精度. 强制转换原数的数据类型,无论原数据是什么,都只保留整数部分. 将扩大后的数对10求余 ...

  5. 华为机考HJ2计算字符个数

    华为机考HJ2计算字符个数 gets();每次收一行字符. getchar();每次收一个字符. 两个都存储后用第二个在第一个串中检索. 大小写的问题用大小写的ASCII码差值32解决. 暴力破解,没 ...

  6. 华为机考HJ1字符串最后一个单词的长度

    华为机考HJ1字符串最后一个单词的长度C语言解法 统计的是字符串最后一个单词的长度. 而不是单词的内容,所以单词的内容并不重要. 只需要用空格来做标志位即可. getchar():每次只收一个字符. ...

  7. 华为机考HJ8合并表记录

    华为机考HJ8合并表记录 其实就是简单的排序+去重,只不过要多一组数据 没有大神们好用,白给. python好像有个map能用,非常简单,不过我不太会. 马上机考,祝我好运. 我机考回来了,就会一个题 ...

  8. 华为机考HJ4字符串分隔C语言题解

    华为机考HJ4字符串分隔C语言题解 好家伙,今天的while循环检测文件末尾又好使了. 把白给打在公屏上. 主要思路就是求余的花样使用. 首先把字符串数组里的内容全部放入新的数组. 新的数组每满八个就 ...

  9. 2023华为机考刷题指南:八周机考速通车

    2023.1.13更新: 拿到了华子offer,看到这个贴子一直有人收藏,最近有空完善一下,主要是把深搜的几道题的题号添上. 华子的机考不算简单,挺难的,还是得好好准备一下,而且技术面必撕题,所以刷题 ...

最新文章

  1. python调用dll例子
  2. c语言中读取内存的文件,c++从内存中读取文件内容,内容写到内存 实现文件的内存共享代码实例...
  3. Hibernate5-多对1(n:1)-fetch=join
  4. python做一个系统代码_python初学者,用python3实现基本的学生管理系统代码实例...
  5. LeetCode 576. 出界的路径数(动态规划)
  6. 高中生用付款截图吃霸王餐近一年 网友:支付宝进来推销
  7. Ubuntu安装usb库
  8. 生成n*n蛇形矩阵的算法
  9. Android pad适配札记
  10. st语言 数组的常用方法_三菱ST语言教学(2)——数组的使用
  11. 一个投标经理的标书检查笔记,拿来就用!
  12. Windows10服务优化
  13. Pytorch显存分配机制与显存占用分析方法
  14. 陶华碧: 就懂辣椒酱,作为吃的东西,即使过了几代,也依然能够传的下去。
  15. Laravel 存在SQL注入漏洞
  16. 试题 入门训练 Fibonacci数列
  17. H5网站-微信浏览器中打开底部fixed遮住内容区域问题
  18. Discuz新秀网络验证管理系统- 火山PC - ver 1.0 - 软件开发框架
  19. 医疗器械图纸管理软件,图文档管理解决方案
  20. 【狮子数学】chapter7-02-齐次微分方程(第106讲)

热门文章

  1. 服务器提示自动关机,服务器出现自动关机
  2. NAS入门之——My Cloud EX2 Ultra通过USB连接外置硬盘
  3. python带cookies发送post请求_Python: 模拟post请求时的相关问题:cookie,json
  4. 微信小程序开发整理-mp3
  5. 仿哔哩哔哩微信小程序源码
  6. java 文件的md5值_Java计算文件的MD5值
  7. 单女最容易邂逅好男人的10个地方
  8. googletrans 中文翻译成英文 安装及使用
  9. oracle 内置时间加减,Oracle 时间加减
  10. 南京理工大学紫金学院 Javaweb跨平台开发实践