算法设计与分析4.1 迷宫问题 栈与队列解法、打印矩阵、三壶问题、蛮力匹配

1.ROSE矩阵

实现:

img

使用算法2

分析: 每半圈元素值的增长规律变换一次
设增量为t,每半圈变换一次t <— -t .
设矩阵边长为i,每半圈的元素个数是2*(i-1)个,hc为记数变量,则1≤hc<=2i-1,前1/4圈是1≤hc<=i-1,后1/4是i≤hc<=2i-2,若hc%i==0,则前1/4圈结果为0,后1/4结果为1,可表示为:index <— hc/i, hc <— hc+1。

计算模型:

设s[1]为矩阵行下标,s[0]为矩阵列下标。s数组下标为index。

t为下标增量,初值为-1,矩阵元素k∈[1,n*n].

1.index<- hc/i+1

2.hc<- hc+1

3.hc∈[1,2*i-1]

4.s[index]<-s[index]+t

5.a[s[1],s[0]]<- k , k<- k+1

6.当hc>2*i-1,i<- i-1 ,t<- -t

代码:

void rose(int n)
{int s[2];int a[n][n];int k=1,i=n,t=1;s[0]=-1,s[1]=0;while(k<=n*n){for(int hc=1;hc<=2*i-1;++hc){int index=hc/(i+1);s[index]+=t;a[s[1]][s[0]]=k;++k;}i--;t=-t;}for(int i=0;i<n;++i){for(int j=0;j<n;++j){cout<<a[i][j]<<"\t";}cout<<endl;}
}

在这里插入图片描述

2.迷宫

在这里插入图片描述

最优路径?

可以使用栈或队列完成。

定义:

int M [ 10 ] [ 10 ] [10][10] [10][10]={
1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,1,
1,0,1,1,1,1,0,1,0,1,
1,0,0,0,0,1,0,1,0,1,
1,0,1,0,0,0,0,1,0,1,
1,0,1,0,1,1,0,1,0,1,
1,0,1,0,0,0,0,1,1,1,
1,0,1,0,0,1,0,0,0,1,
1,0,1,1,1,1,1,1,0,1,
1,1,1,1,1,1,1,1,1,1,} ;

//状态定义 :
// M [ x ] [ y ] [x][y] [x][y]为0:通路 ,为1:墙 , 为2:死路 , 为3:已走过

int fx[]={-1,1,0,0};
int fy[]={0,0,-1,1};
typedef struct p
{int x,y;struct p* next;
}point;

1).若使用栈:

主要代码:

void bfs()
{stack<point*>s;point *head=new point,*p;int x=1,y=1;head->x=x;head->y=y; head->next=NULL;M[x][y]=3;s.push(head);int flag=0;while(!s.empty() ){p=s.top();s.pop();//cout<<"front:"<<p->x<<" "<<p->y<<endl;for(int i=0;i<4;++i){y=p->y+fy[i];x=p->x+fx[i];if(M[x][y]==0){//cout<<x<<" "<<y<<endl; M[x][y]=3;point * newp=new point;newp->x=x;newp->y=y;newp->next=p;s.push(newp);if(x==8 && y==8){flag=1;break;} }}if(flag)break;} 
​	p=s.top();while(p){
​		cout<<"("<<p->x<<","<<p->y<<")"<<"  ";
​		p=p->next;}}

具体实现:

在这里插入图片描述

使用栈可以完成查找,但因其后入先出的特性,在程序实现中,优先对左上方的节点进行查找,针对此迷宫而言会产生一些不必要的路径。

所以若想最短时间得到最优路径可以使用队列。

2).队列实现:队列由于其先入先出的特点,每次都对右下方的点进行率先遍历,故更容易找到最优路径。

使用链表存储。

主要代码实现:

void bfs()
{m[x][y]=3;p=new po;p->x=x;p->y=y;p->pre=NULL;q.push(p);while(!q.empty() ){po * p1=q.front();q.pop();for(int i=0;i<4;i++){po* pnew=new po;pnew->pre=NULL; pnew->x =p1->x + fx[i];pnew->y = p1->y+ fy[i];if(m[pnew->x][pnew->y] ==0 ){m[pnew->x][pnew->y]=3;pnew->pre=p1;q.push(pnew);}if(pnew->x==8 && pnew->y==8)return;} }} 

实现:
在这里插入图片描述

使用队列来实现,其时间为使用栈实现的一半左右。

3.三壶问题

在这里插入图片描述

BFS思想 穷举+回溯.

代码实现:

逐步模拟三个壶的倒水状态

typedef struct node
{int x,y,z;struct node * pre;
}node;
queue<node*>q;
node *p2;
node *p3;
set<int> cha;
bool is(node *p)
{if(p->x==4||p->y==4||p->z==4)return true;else 	return false;
}
void out(node *p)
{cout<<"("<<p->x<<","<<p->y<<","<<p->z<<")"<<endl;
}
void BFS()
{node *p=new node;p->x=8;p->y=0;p->z=0;p->pre=NULL;q.push(p);while(!q.empty()){node *p1=q.front();if(is(p1))	return;int x=p1->x;int y=p1->y;int z=p1->z;q.pop();if(cha.find(x*100+y*10+z)!=cha.end())  //没有任何一组状态使用此公式得到的计算结果是相同的,故用此来判别状态是否已被遍历 continue;else	cha.insert(x*100+y*10+z);if(x>0&&y<5){p3=new node;if(x+y>5){p3->x=x+y-5;p3->y=5;}else{p3->x=0;p3->y=x+y;}p3->z=z;p3->pre=p1;q.push(p3);if(is(p3))	return;}if(x>0&&z<3){p3=new node;if(x+z>3){p3->x=x+z-3;p3->z=3;}else{p3->x=0;p3->z=x+z;}p3->y=y;p3->pre=p1;q.push(p3);if(is(p3))	return;}if(y>0){p3=new node;p3->x=x+y;p3->y=0;p3->z=z;p3->pre=p1;q.push(p3);if(is(p3))	return;}if(z>0){p3=new node;p3->x=x+z;p3->z=0;p3->y=y;p3->pre=p1;q.push(p3);if(is(p3))	return;}if(y>0&&z<3){p3=new node;if(y+z>3){p3->y=y+z-3;p3->z=3;}else{p3->y=0;p3->z=y+z;}p3->x=x;p3->pre=p1;q.push(p3);if(is(p3))	return;}if(z>0&&y<5){p3=new node;if(y+z>5){p3->z=y+z-5;p3->y=5;}else{p3->z=0;p3->y=y+z;}p3->x=x;p3->pre=p1;q.push(p3);if(is(p3))	return;			}}
}

在这里插入图片描述

在这里插入图片描述

4.蛮力匹配

有A B两个字符串 ,长度为n和m

则其最差情况下:首先让A从第一个字符与B的各个字符进行比较,耗时m,A中共n个字符

耗时:O((n-m-1)*m)

5.相当于全排列,则共需 T(n)=O( (n-1)! )时间

6.经计算:15!=1307674368000

16!=20922789888000

18!=6402373705728000

19!=121645100408832000

1小时 运算:3.6* 1 0 13 10^{13} 1013次 16个城市

24小时 运算8.64* 1 0 14 10^{14} 1014次 17个城市

1年运算3.1536* 1 0 17 10^{17} 1017次 19个城市

100年运算3.1536* 1 0 19 10^{19} 1019​次 20个城市

  1. BFS时间复杂度分析

使用邻接表完成

对于 G 令 vexnum=n 即节点数量为n 对于邻接表:共e条边

则其所需时间共分为两部分,n个节点需要O(n)的复杂度,

而邻接表需O(e)的复杂度~ 总时间复杂度为O(n+e).

8.背包问题

1)时间复杂度

单纯通过穷举法,则:对于n个物品,会有 2 n − 1 2^{n-1} 2n1种解 时间复杂度为 O ( 2 n ) O(2^{n}) O(2n)

2)改进

动规

int main()
{int N, V;cin >> N >> V;vector<int> v(N + 1), w(N + 1), f(V + 1);for(int i = 1; i <= N; ++i)cin >> v[i] >> w[i];for(int i = 1; i <= N; ++i)for(int j = V; j >= v[i]; --j)f[j] = max(f[j], f[j - v[i]] + w[i]);cout << *max_element(f.begin(), f.end());return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

时间复杂度: O ( N ∗ V ) O(N*V) O(NV)

贪心

对物品的: 价值/物品体积 进行排序,逐个判断其体积是否能被装下

int G()
{float temp=0;float result=0;float c1=8; 
for(int i=0;i<4;i++)
{for(i=0;i<4;i++){if(temp<sortBest[i])temp=sortBest[i];}//cout<<"max(sortBest)="<<temp<<endl;for(i=0;i<4;i++){if (temp==sortBest[i])sortBest[i]=0; if (w[i]<=c1)result=result+v[i];c1=c1-w[i]; }
}

在这里插入图片描述

时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

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

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

相关文章

[华为OD]C卷 找座位,在一个大型体育场内举办了一场大型活动,由于疫情防控的需要 100

题目&#xff1a; 在一个大型体育场内举办了一场大型活动&#xff0c;由于疫情防控的需要&#xff0c;要求每位观众的必须间隔至 少一个空位才允许落座。现在给出一排观众座位分布图Q,座位中存在已落座的观众&#xff0c;请计 算出&#xff0c;在不移动现有观众座位的情况…

Linux中ssh登录协议

目录 一.ssh基础 1.ssh协议介绍 2.ssh协议的优点 3.ssh文件位置 二.ssh原理 1.公钥传输原理&#xff08;首次连接&#xff09; 2.ssh加密通讯原理 &#xff08;1&#xff09;对称加密 &#xff08;2&#xff09;非对称加密 3.远程登录 三.服务端的配置 常用的配置项…

vscode 配置与插件记录

vscode插件 python PythonPython DebuggerruffisortPylanceJupyterJupyter KeymapJupyter Slide ShowJupyter Cell TagsautoDocstring - Python Docstring Generator ruff isort pylance autodocsting 在setting.json里这么配置&#xff0c;这样你保存时就会自动format…

Matlab|含sop的33节点配电网优化

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序以IEEE33节点为例&#xff0c;分析含sop的配电网优化&#xff0c;包括sop有功约束、无功约束和容量约束&#xff0c;非线性部分通过转换为旋转锥约束进行编程&#xff0c;并且包括33节点配电网潮流及对应…

Re69:读论文 LaMDA: Language Models for Dialog Applications

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;LaMDA: Language Models for Dialog Applications ArXiv网址&#xff1a;https://arxiv.org/abs/2201.08239 本文介绍谷歌提出的对话大模型LaMDA&#xff0c;主要关注对各项指标&#x…

智慧能源数据监控平台

随着科技的飞速发展&#xff0c;能源管理已逐渐从传统的粗放型向精细化、智能化转变。在这个转型过程中&#xff0c;HiWoo Cloud平台的智慧能源数据监控平台以其独特的技术优势和创新理念&#xff0c;正引领着能源管理的新潮流。 一、智慧能源数据监控平台的概念 智慧能源数据…

经典文献阅读之--SurroundOcc(自动驾驶的环视三维占据栅格预测)

0. 简介 环视BEV已经是很多场景中需要的功能&#xff0c;也是视觉代替激光雷达的有效解决方案&#xff0c;而《SurroundOcc: Multi-camera 3D Occupancy Prediction for Autonomous Driving》一吻则代表了这个领域的SOTA算法&#xff0c;文中通过多帧点云构建了稠密占据栅格数据…

python爬虫插件XPath的安装

概要 XPath Helper是一款专用于chrome内核浏览器的实用型爬虫网页解析工具。XPath可以轻松快捷地找到目标信息对应的Xpath节点&#xff0c;获取xpath规则&#xff0c;并提取目标信息&#xff0c;并进行校对测试&#xff1b;可对查询出的xpath进行编辑&#xff0c;正确编辑的结…

微信开发api、微信视频号开发

接口地址&#xff1a; http://api.videostui.com/finder/v2/api/login/checkLogin 接口说明 获取到登录二维码后需每间隔5s调用本接口来判断是否登录成功新设备登录平台&#xff0c;次日凌晨会掉线一次&#xff0c;重新登录时需调用获取二维码且传appId取码&#xff0c;登录成…

android studio拍照功能问题解决

1.点击拍照功能直接闪退 2.拍照后不能选择确认键&#xff0c;无法保存 上述是在android studio做项目中经常会使用到模拟器或真机的拍照功能时主要遇到的两个问题。 解决方法&#xff1a; 1.直接闪退问题&#xff1a; if(Build.VERSION.SDK_INT>Build.VERSION_CODES.N)…

关于使用SpringSecurity框架发起JSON请求,但因登陆失效导致响应403的问题。

这里记录一个生产中遇到的一个问题。 现有环境是基于SpringBoot 2.6.8&#xff0c;然后是前后台一体化的项目。 安全框架使用的是内置版本的SpringSecurity。 在实际使用过程中遇到一个问题。 就是当用户登陆失效后&#xff0c;前端操作JSON请求获取列表数据&#xff0c;但…

323_C++_QT_使用QProcess执行cmd解压tar.gz等等其他压缩包文件到指定目录,不需要外部库,QT自带API的就行

// decompressPath : 解压到此目录 // fileName : 解压的tar.gz文件名executeCommand(decompressPath , QString::fromStdString(fileName));// 开始解压 void executeCommand

上海亚商投顾:沪指创年内新高 房地产板块掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日继续反弹&#xff0c;沪指盘中涨超1%&#xff0c;重返3100点上方&#xff0c;深成指涨超2%&#…

初探 JUC 并发编程:Java 并发包中并发 List 源码剖析

最近在阅读 《Java 并发编程之美》这本书&#xff0c;感觉学到了很多东西&#xff1b;所以我决定将从事书中学到的思想和一些经典的案例整理成博客的形式与大家分享和交流&#xff0c;如果对大家有帮助别忘了留下点赞和关注捏。 第五部分&#xff1a;Java 并发包中并发 List 源…

性能监控之prometheus+grafana搭建

前言 Prometheus和Grafana是两个流行的开源工具&#xff0c;用于监控和可视化系统和应用程序的性能指标。它们通常一起使用&#xff0c;提供了强大的监控和数据可视化功能。 Prometheus Prometheus是一种开源的系统监控和警报工具包。它最初由SoundCloud开发&#xff0c;并于…

Android log tag标签如am_pss意义

Android log tag标签如am_pss意义 Android输出日志中不同的标签代表不同的意义&#xff0c;比如 am_pss&#xff0c;则代表内存回收&#xff08;整理&#xff09;。定义在源代码文件 &#xff1a; https://android.googlesource.com/platform/frameworks/base//master/servic…

Python数据分析大作业(ARIMA 自回归积分滑动平均模型) 4000+字 图文分析文档 销售价格库存分析+完整python代码

资源地址&#xff1a;Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 完整代码分析 ​ 同时销售量后1000的sku品类占比中&#xff08;不畅销产品&#xff09;如上&#xff0c;精品类产品占比第一&#xff0c;达到66.7%&#xff0c;其次是香化类产品&#x…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-8.1

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

使用opencv改变图片大小

使用opencv改变图片大小 图片的宽度和高度效果代码 图片的宽度和高度 宽度&#xff1a;图片的宽度指的是图像从左边缘到右边缘的水平跨度。在数字图像中&#xff0c;宽度通常是以像素&#xff08;pixels&#xff09;为单位来度量的。高度&#xff1a;图片的高度指的是图像从上…

【go项目01_学习记录day01】

博客系统 1 vscode开发go项目插件推荐1.1 CtrlShiftP&#xff08;俗称万能键&#xff09; &#xff1a;打开命令面板。在打开的输入框内&#xff0c;可以输入任何命令。1.2 开发时&#xff0c;我们需要经常查阅 Go 语言官方文档&#xff0c;可惜因国内访问外网不稳定&#xff0…