蜜蜂采蜜最短路径(华为机考反思)(暴力破解)
大概题目:蜂巢在坐标(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'。
今天的我又是个瓜娃子。
蜜蜂采蜜最短路径(华为机考反思)(暴力破解)相关推荐
- 蜜蜂采蜜最短路径c语言算法,粒子群算法解最短路径.doc
摘要 粒子群优化算法(Particle Swarm Optimization,PSO)是由美国的Eberhart和Kennedy在1995年提出的一种高效的并行优化算法.由于该算法具有深刻的智能背景, ...
- 蜜蜂采蜜最短路径c语言算法,S018 蜜蜂采蜜太辛苦了,编程实现还是很容易的
原标题:S018 蜜蜂采蜜太辛苦了,编程实现还是很容易的 上节课完成了codeorg课程2的第7节的课程. 这节课学习codeorg课程2的第8节课程. 课程2第8节第1关和第2关 打开浏览器,输入网 ...
- 华为机考HJ13句子逆序C语言弱智解法
华为机考HJ13句子逆序C语言弱智解法 句子逆序C语言低端解法,易于理解. 1.收数据老生常谈. 2.将句子全部逆序. 3.将单词正序. (这里有一个bug,最后一个词(原句子第一个词)总是收不到,所 ...
- 华为机考HJ7取近似值
华为机考HJ7取近似值 只有小数点后一位,所以扩大十倍,让小数点后的数都为0. 然后强制转换成整型,不会影响精度. 强制转换原数的数据类型,无论原数据是什么,都只保留整数部分. 将扩大后的数对10求余 ...
- 华为机考HJ2计算字符个数
华为机考HJ2计算字符个数 gets();每次收一行字符. getchar();每次收一个字符. 两个都存储后用第二个在第一个串中检索. 大小写的问题用大小写的ASCII码差值32解决. 暴力破解,没 ...
- 华为机考HJ1字符串最后一个单词的长度
华为机考HJ1字符串最后一个单词的长度C语言解法 统计的是字符串最后一个单词的长度. 而不是单词的内容,所以单词的内容并不重要. 只需要用空格来做标志位即可. getchar():每次只收一个字符. ...
- 华为机考HJ8合并表记录
华为机考HJ8合并表记录 其实就是简单的排序+去重,只不过要多一组数据 没有大神们好用,白给. python好像有个map能用,非常简单,不过我不太会. 马上机考,祝我好运. 我机考回来了,就会一个题 ...
- 华为机考HJ4字符串分隔C语言题解
华为机考HJ4字符串分隔C语言题解 好家伙,今天的while循环检测文件末尾又好使了. 把白给打在公屏上. 主要思路就是求余的花样使用. 首先把字符串数组里的内容全部放入新的数组. 新的数组每满八个就 ...
- 2023华为机考刷题指南:八周机考速通车
2023.1.13更新: 拿到了华子offer,看到这个贴子一直有人收藏,最近有空完善一下,主要是把深搜的几道题的题号添上. 华子的机考不算简单,挺难的,还是得好好准备一下,而且技术面必撕题,所以刷题 ...
最新文章
- python调用dll例子
- c语言中读取内存的文件,c++从内存中读取文件内容,内容写到内存 实现文件的内存共享代码实例...
- Hibernate5-多对1(n:1)-fetch=join
- python做一个系统代码_python初学者,用python3实现基本的学生管理系统代码实例...
- LeetCode 576. 出界的路径数(动态规划)
- 高中生用付款截图吃霸王餐近一年 网友:支付宝进来推销
- Ubuntu安装usb库
- 生成n*n蛇形矩阵的算法
- Android pad适配札记
- st语言 数组的常用方法_三菱ST语言教学(2)——数组的使用
- 一个投标经理的标书检查笔记,拿来就用!
- Windows10服务优化
- Pytorch显存分配机制与显存占用分析方法
- 陶华碧: 就懂辣椒酱,作为吃的东西,即使过了几代,也依然能够传的下去。
- Laravel 存在SQL注入漏洞
- 试题 入门训练 Fibonacci数列
- H5网站-微信浏览器中打开底部fixed遮住内容区域问题
- Discuz新秀网络验证管理系统- 火山PC - ver 1.0 - 软件开发框架
- 医疗器械图纸管理软件,图文档管理解决方案
- 【狮子数学】chapter7-02-齐次微分方程(第106讲)