c++游戏小技巧6:rand()+随机迷宫(3写法:BFS,DFS,并查集)

news2024/11/27 12:59:23

目录

1.前言

2.前文(rand,随机数引入)

1.rand()

2.srand,随机数种子

3.用法:

        1. 生成0~RAND_MAX里面的数

        2.生成大于RAND_MAX的数 

        3.生成负数

3.正文(确信)

1.bfs写法:

1.让迷宫全是墙+确定起点

 2.初始化

 3.循环操作:

  4.总代码:

2.DFS写法

        1.初始化

        2.DFS

        3.总代码 

3.并查集写法

        1.创建列表

        2.并查集基操

        3.制造迷宫

        4.(为了方便操作) 记录迷宫

        5.总代码 

4.注意事项

5.各方法对比(就我而言)

4.后记

1.前言

(阅读本文前,请先保证已阅读前5篇!!!!)

2.前文(rand,随机数引入)

(引入正题:)

先引入一位朋友的代码ZQK13的博客-CSDN博客​​​​​​

当你运行后,你会发现:

你眼前有一个不像MG的MG

怎么说呢:不好说吧,一个可行又不可行的办法

所以我简单更新了一篇······

1.rand()

为了突出随机,我们会使用一个伪随机数

它位于:

#include<stdlib.h>

这个头文件中(当然,还有很多)

但伪随机就是伪随机,你可以多次重复运行下面一段代码:

#include<iostream>
using namespace std;

int main()
{
	printf("%d\n",rand());
	return 0;
}

发现没有:果然是伪随机

那就要讲到第二个好东西了

2.srand,随机数种子

srand()  随机数种子(与MC中的种子一个意思(?))需要的头文件见下:

#include<stdlib.h>
#include<ctime>
using namespace std;

int main()
{
	srand(time(NULL));
	return 0;
}

我们以当前时间为种子,就能保证伪随机不会那么伪了(你家时间一去还能反?)

对了,强调一个重点:在windows系统中,rand()能生成的随机数只能在0~32767之间

所以:简单的用法就是

3.用法:

1. 生成0~RAND_MAX里面的数
#include<stdlib.h>
#include<ctime>
using namespace std;

int main()
{
	srand(time(NULL));
	int mod=114;
	int a=rand()%mod;//生成0~113之间的数
	int b=rand()%mod+mod;//生成114~227之间的数
	int c=rand()%514+114;//生成114~627之间的数
	//公式:p=rand()%a+b; 生成 b ~ b+a-1 (包括两端)的随机数 
	//and so on 
	return 0;
}
2.生成大于RAND_MAX的数
#include<stdlib.h>
#include<ctime>
using namespace std;

int main()
{
	srand(time(NULL));
	int a=rand();//32768进制数的高位
	int b=rand();//32768进制数的低位
	int c=a*32768+b;//计算出这个数
	//建议函数封装 
}
3.生成负数

(凑个数)

#include<stdlib.h>
#include<ctime>
using namespace std;

int main()
{
	srand(time(NULL));
	int a=-rand();
}

3.正文(确信)

随机迷宫有很多种写法。

推荐两种

1.bfs写法:

 

 

1.让迷宫全是墙.
2.选起点作为迷宫的通路,然后把它的邻墙放入列表
3.当列表里还有墙时
①.从列表里随机选一个墙,如果这面墙分隔的两个单元格只有一个单元格被访问过
(a)那就从列表里移除这面墙,让未访问的单元格成为迷宫的通路
(b)把这个格子的墙加入列表
②.如果墙两面的单元格都已经被访问过,那就从列表里移除这面墙

1.让迷宫全是墙+确定起点

void init()
{
	x_p=X,y_p=Y;
	start.x=X,start.y=Y;
	memset(dt,WALL,sizeof(dt));
	dt[X][Y]=KONG;
}
2.初始化
//迷宫大小 
#define m 11
#define n 11
//构成
#define player '!'
#define wall '#'
#define kong ' ' 
//起点
#define X 1
#define Y 1

//操作 
#define down 1
#define right 2
#define left 4
#define up 8
//迷宫内 
#define WALL -1
#define KONG 2

注意:只能更改 m n player wall X Y (注意大小写)

可以更改n,m为任意奇数,player为玩家样式,wall为墙样式,(X,Y)为起点

3.循环操作:
	while(where.size())
	{
		int r=rand()%(where.size());
		qiang what=where[r];
		x_p=what.x;
		y_p=what.y;
		switch(what.f)
		{
			case down:{x_p++;break;}
			case right:{y_p++;break;}
			case left:{y_p--;break;}
			case up:{x_p--;break;}
		}
		if(dt[x_p][y_p]==WALL) dt[what.x][what.y]=dt[x_p][y_p]=KONG,put_wall();
		where.erase(where.begin()+r);
	}
4.总代码:
#include<bits/stdc++.h>
using namespace std;

//迷宫大小 
#define m 11
#define n 11
//构成
#define player '!'
#define wall '#'
#define kong ' ' 
//起点
#define X 1
#define Y 1

//操作 
#define down 1
#define right 2
#define left 4
#define up 8
//迷宫内 
#define WALL -1
#define KONG 2
struct qiang
{
	int x,y,f;
	qiang(int xx,int yy,int ff) {x=xx,y=yy,f=ff;}
};
struct play_er{int x,y;}start,end;
vector<qiang> where;

int x_p,y_p;
int dt[1010][1010];

void init()
{
	x_p=X,y_p=Y;
	start.x=X,start.y=Y;
	memset(dt,WALL,sizeof(dt));
	dt[X][Y]=KONG;
}

void put_wall()
{
	if(x_p+1<=m&&dt[x_p+1][y_p]==WALL) where.push_back(qiang(x_p+1,y_p,down));
	if(y_p+1<=n&&dt[x_p][y_p+1]==WALL) where.push_back(qiang(x_p,y_p+1,right));
	if(x_p-1>=1&&dt[x_p-1][y_p]==WALL) where.push_back(qiang(x_p-1,y_p,up));
	if(y_p-1>=1&&dt[x_p][y_p-1]==WALL) where.push_back(qiang(x_p,y_p-1,left));
}

int main()
{
	init();
	srand(time(NULL));
	put_wall();
	while(where.size())
	{
		int r=rand()%(where.size());
		qiang what=where[r];
		x_p=what.x;
		y_p=what.y;
		switch(what.f)
		{
			case down:{x_p++;break;}
			case right:{y_p++;break;}
			case left:{y_p--;break;}
			case up:{x_p--;break;}
		}
		if(dt[x_p][y_p]==WALL) dt[what.x][what.y]=dt[x_p][y_p]=KONG,put_wall();
		where.erase(where.begin()+r);
	}
	for(int i=0;i<=m+1;i++)
	{
		for(int j=0;j<=n+1;j++)
		{
			if(i==start.x&&j==start.y) printf("%c",player);
			else if(dt[i][j]==KONG) printf("%c",kong);
			else printf("%c",wall);
		}
		printf("\n");
	}
	return 0;
}

2.DFS写法

思路差不多 

 

  1. 初始化大地图,只有0和1的状态。其中,0和1分别代表道路和墙体,注意四周皆墙
  2. 靠近边缘随机选取状态为1的道路点,作为起点 a
  3. 在起点 a 的上下左右四个方向,跨两个寻找同样为1的道路点 c
    1. 如果找到,则将它们之间的墙体 b 打通,然后将 c 作为新的起点,然后继续进行第2步
    2. 如果四个方向都没有找到,则不断回退到上一点,直到找到有一点其他方向满足条件,然后继续查询
  4. 当查无可查的时候,迷宫也就填充完毕了
 1.初始化
void init()
{
	start.x=X,start.y=Y;
	memset(dt,WALL,sizeof dt);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(i==1||i==n||j==1||j==m) dt[i][j]=WALL;
			if(i%2==0&&j%2==0) dt[i][j]=KONG;
			else dt[i][j]=WALL;
		}
	}
	dt[X][Y]=KONG;
}
 2.DFS
void dfs(int x,int y)
{
	bool f[5]={0};
	while(1)
	{
		if(f[0]&&f[1]&&f[2]&&f[3]) return ;
		int r=rand()%4;
		int nx=fx[r][0],ny=fx[r][1],zx=zj[r][0],zy=zj[r][1];
		if(x+nx<1||x+nx>n||y+ny<1||y+ny>m) {f[r]=1;continue;}//return ;
		if(dt[x+zx][y+zy]!=WALL||v[x+zx][y+zy]||v[x+nx][y+ny]) {f[r]=1;continue;}//return ;
		f[r]=1;
		dt[x+zx][y+zy]=KONG;
		v[x+zx][y+zy]=v[x+nx][y+ny]=1;
		dfs(x+nx,y+ny);
	}
	return ;
}
3.总代码 
#include<bits/stdc++.h>
using namespace std;

//迷宫大小(必须奇数) 
#define m 11
#define n 11
//构成
#define player '!'
#define wall '#'
#define kong ' ' 
//起点(必须偶数且在迷宫边缘)
#define X 2
#define Y 2

//迷宫内 
#define WALL -1
#define KONG 2

struct play_er{int x,y;}start;
int dt[1010][1010];
int fx[5][5]={{2,0},{-2,0},{0,2},{0,-2}};
int zj[5][5]={{1,0},{-1,0},{0,1},{0,-1}};
bool v[1010][1010]={0};

void init()
{
	start.x=X,start.y=Y;
	memset(dt,WALL,sizeof dt);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(i==1||i==n||j==1||j==m) dt[i][j]=WALL;
			if(i%2==0&&j%2==0) dt[i][j]=KONG;
			else dt[i][j]=WALL;
		}
	}
	dt[X][Y]=KONG;
}

void dfs(int x,int y)
{
	bool f[5]={0};
	while(1)
	{
		if(f[0]&&f[1]&&f[2]&&f[3]) return ;
		int r=rand()%4;
		int nx=fx[r][0],ny=fx[r][1],zx=zj[r][0],zy=zj[r][1];
		if(x+nx<1||x+nx>n||y+ny<1||y+ny>m) {f[r]=1;continue;}//return ;
		if(dt[x+zx][y+zy]!=WALL||v[x+zx][y+zy]||v[x+nx][y+ny]) {f[r]=1;continue;}//return ;
		f[r]=1;
		dt[x+zx][y+zy]=KONG;
		v[x+zx][y+zy]=v[x+nx][y+ny]=1;
		dfs(x+nx,y+ny);
	}
	return ;
}

int main()
{
	init();
	srand(time(NULL));
	dfs(X,Y);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(i==start.x&&j==start.y) printf("%c",player);
			else if(dt[i][j]==KONG) printf("%c",kong);
			else printf("%c",wall);
		}
		printf("\n");
	}
	return 0;
}

3.并查集写法

 

  1. 创建所有墙的列表(除了四边),并且创建所有单元的集合,每个集合中只包含一个单元。
  2. 随机从墙的列表中选取一个,取该墙两边分隔的两个单元
    1. 两个单元属于不同的集合,则将去除当前的墙,把分隔的两个单元连同当前墙三个点作为一个单元集合;并将当前选中的墙移出列表
    2. 如果属于同一个集合,则直接将当前选中的墙移出列表
  3. 不断重复第 2 步,直到所有墙都检测过 
1.创建列表
void init()
{
	for(int i=1;i<=n*n;i++) fa[i]=i;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int d=0;d<2;d++)
				if(i+dx[d]>0&&j+dy[d]>0&&i+dx[d]<=n&&j+dy[d]<=n)v.push_back((qiang){i,j,i+dx[d],j+dy[d]});
}
 2.并查集基操
#define Hash(a,b) (a-1)*n+b
int find(int f){return fa[f]==f?f:fa[f]=find(fa[f]);}
void merge(qiang zmx){fa[find(Hash(zmx.fx,zmx.fy))]=find(Hash(zmx.sx,zmx.sy));}
bool judge(qiang zmx){return find(Hash(zmx.fx,zmx.fy))==find(Hash(zmx.sx,zmx.sy));}
3.制造迷宫
    while(!v.empty())
	{
		int r=rand()%v.size();
		if(!judge(v[r])) merge(v[r]),mp[v[r].fx][v[r].fy][v[r].sx][v[r].sy]=KONG;
		v.erase(v.begin()+r);
	}
 4.(为了方便操作) 记录迷宫
void vec_to_int()
{
	int idx=1,jdx=0;
	for(int i=1;i<=2*n+1;i++) dt[1][i]=WALL;
	for(int i=1;i<=n;i++)
	{
		dt[i+idx][1]=WALL;
		jdx=1;
		for(int j=1;j<=n+1;j++) dt[i+idx][j+jdx]=KONG,((j!=n)&&(mp[i][j][i][j+1]==KONG))?dt[i+idx][j+(++jdx)]=KONG:dt[i+idx][j+(++jdx)]=WALL;
		idx++,jdx=1;
		for(int j=1;j<=n+1;j++) dt[i+idx][j+jdx]=WALL,((i!=n)&&(mp[i][j][i+1][j]==KONG))?dt[i+idx][j+(++jdx)]=KONG:dt[i+idx][j+(++jdx)]=WALL;
		dt[2*n+1][2*n+1]=WALL;
	}
	dt[X][Y]=Player;
}
5.总代码 
#include<bits/stdc++.h>
#define Hash(a,b) (a-1)*n+b
using namespace std;

//起点,可自己设,为偶数 
#define X 2
#define Y 2
//迷宫大小 
#define n 124//生成2*n+1的矩阵  2~126
//不要动m 
#define m 125//数组大小,不要改 
//迷宫内
#define WALL -1
#define KONG 2
#define Player 11
//样式:
#define wall '#'
#define kong ' ' 
#define player '!'

int fa[m*m*m*m+100],mp[m][m][m][m],dt[m*2+2][m*2+2];
int dx[2]={0,1},dy[2]={1,0};

struct qiang{int fx,fy,sx,sy;};
vector<qiang> v;

int find(int f){return fa[f]==f?f:fa[f]=find(fa[f]);}
void merge(qiang zmx){fa[find(Hash(zmx.fx,zmx.fy))]=find(Hash(zmx.sx,zmx.sy));}
bool judge(qiang zmx){return find(Hash(zmx.fx,zmx.fy))==find(Hash(zmx.sx,zmx.sy));}

void init()
{
	for(int i=1;i<=n*n;i++) fa[i]=i;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			if(i+1<=n) v.push_back((qiang){i,j,i+1,j});
			if(j+1<=n) v.push_back((qiang){i,j,i,j+1});
		}
}

void vec_to_int()
{
	int idx=1,jdx=0;
	for(int i=1;i<=2*n+1;i++) dt[1][i]=WALL;
	for(int i=1;i<=n;i++)
	{
		dt[i+idx][1]=WALL;
		jdx=1;
		for(int j=1;j<=n+1;j++) dt[i+idx][j+jdx]=KONG,((j!=n)&&(mp[i][j][i][j+1]==KONG))?dt[i+idx][j+(++jdx)]=KONG:dt[i+idx][j+(++jdx)]=WALL;
		idx++,jdx=1;
		for(int j=1;j<=n+1;j++) dt[i+idx][j+jdx]=WALL,((i!=n)&&(mp[i][j][i+1][j]==KONG))?dt[i+idx][j+(++jdx)]=KONG:dt[i+idx][j+(++jdx)]=WALL;
		dt[2*n+1][2*n+1]=WALL;
	}
	dt[X][Y]=Player;
}

int main()
{
	srand((unsigned int)time(NULL));
	init();
	while(!v.empty())
	{
		int r=rand()%v.size();
		if(!judge(v[r])) merge(v[r]),mp[v[r].fx][v[r].fy][v[r].sx][v[r].sy]=KONG;
		v.erase(v.begin()+r);
	}
	vec_to_int();
	for(int i=1;i<=2*n+1;i++)
	{
		for(int j=1;j<=2*n+2;j++)
		{
			if(dt[i][j]==WALL) cout<<wall;
			if(dt[i][j]==KONG) cout<<kong;
			if(dt[i][j]==Player) cout<<player;
		}
		cout<<endl;
	}
	return 0;
}

4.注意事项

1.可以把它变成头文件,把main里面的移植到一个函数里。

2.原文代码部分为本蒟蒻手打,其余均经过作者优化,所以,转载请附上原网址

3.建议只更改起点,大小,样式,其余的尽量不要动

4.地图均存在 dt[][] 里,调用 dt[][] 输出即可

5.注意!并查集生成的地图是2*n+1!!!

5.各方法对比(就我而言)

BFS生成DFS生成并查集生成

时间

123:中

299:优

567:差

123:优(真的)

299:差

567:优

123:差

299:/

567:/

空间

码量
主路(一 般)不明显明显不明显

岔路(一般)

地图大小设置  0~10090~5670~124
I/O reads

55:中

123:优

299:差

55:差

123:差(特差)

299:优

55:优

123:中

299:/

时间、空间、I/Oreads判断   c++ build benchmarks (生成同样大小迷宫下)

(冒号前的数据表示测试的地图大小)

(至于以上的吗······想都不用想,DFS绝对拉,BFS绝对快)

问题:有时候n,m给大了就会报

ailed to execute "C:\Users\Administrator\Desktop\未命名4.exe":Error 0: 操作成功完成。

请问要怎么解决QwQ

其余均为本蒟蒻的主观判定

4.后记

这篇文章耗费了我很多时间。

一些代码的bug改得人都费了

能不能一键三连呀!!!( QWQ )

参考文章:

房间和迷宫:一个地牢生成算法 | indienova 独立游戏

【UE4】迷宫生成——DFS、Prim、Kruskal算法实现 - 砥才人 - 博客园 (cnblogs.com)

上一篇:

下一篇:未完待续······

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

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

相关文章

路径规划算法:基于天鹰优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于天鹰优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于天鹰优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法天鹰…

漏洞复现 || TerraMaster TOS exportUser.php 远程命令执行

阅读须知 技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。…

既有颜值又能打,达尔优实用之外的设计进化

对于时下不少二次元或游戏玩家来说,外设产品不再只是实用就够了,设计、风格也很重要,可盐可甜,有帅的也要有萌的,主打一个个性十足又非常实用。在这样的趋势下,达尔优的A系列,一改以往“硬朗”的设计风格,加入更多更贴合年轻人审美取向的主题配色。除此,新推出的针对女性市场的…

为什么Qt没有像其他框架一样广泛流行起来?

Qt 是一种功能强大且广泛应用的跨平台开发框架&#xff0c;具有许多优点。然而&#xff0c;以下是一些可能解释为什么 Qt 没有像其他框架那样广泛流行起来的原因&#xff1a; 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 知名度和推广力度&#xff1a…

GPT模型应用丨遥感云大数据在灾害、水体与湿地领域典型案例实践

​ ​ ​ ​ 第一部分 基础实践 一 平台及基础开发平台 GEE平台及典型应用案例介绍&#xff1b; GEE开发环境及常用数据资源介绍&#xff1b; ChatGPT、文心一言等GPT模型介绍 JavaScript基础简介&#xff1b; GEE遥感云重要概念与典型数据分析流程&#xff1b; …

技术导向下的业务测试何去何从?

前两天我发了篇鼓励测试人员学编程&#xff08;思维&#xff09;的文章《做测试到底要不要学编程&#xff1f;》&#xff0c;有不少同学在后台问我&#xff0c;自己底子差&#xff0c;实在跟不上怎么办&#xff1f; 看起来&#xff0c;应该是我没说清楚&#xff0c;导致大家有…

SOCVPOCV、global/local variation

Global/local variation global variation 用PVT 跟 RC-corner 来模拟&#xff1b;local variation 用 OCV/ AOCV/ SOCV 来模拟。在40nm 之前OCV 被广泛采用&#xff0c;但是OCV 对同一条path 上的所有cell 都设同一个derate 值&#xff0c;如果设的太严则过于悲观&#xff0c;…

自定义设置echarts label里的颜色

自定义echarts label里的颜色 option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [120, 200, 150, 80, 70, 110, 130],type: bar,label:{show: true,formatter: function (params){console.log(params)if (pa…

Three.js加载外部glb,fbx,gltf,obj 模型文件

vue3使用Three.js加载外部模型文件 1.安装Three.js yarn add three npm install three2.新建一个renderModel.js 用于处理Three.js相关逻辑 import * as THREE from three //导入整个 three.js核心库 import { GLTFLoader } from three/examples/jsm/loaders/GLTFLoader im…

FENDI CLUB啤酒,浅谈精酿分类

啤酒被爱酒人士戏称为是世界是最复杂的快乐酒精饮料。据不完全统计&#xff0c;啤酒的分类不少于120种。如果要详细分类的话&#xff0c;需要很大的篇幅。FENDI CLUB啤酒给大家一个简单的区分类别方法。 一般谈到精酿啤酒说的就是各式各样的艾尔&#xff0c;英文是Ale&#xff…

c++中的时间处理(2)time.h库及几个time相关的函数

关于time.h&#xff0c;有人总结了这么3句话&#xff1a; &#xff08;1&#xff09;time_t&#xff1a;表示距离 UTC 时间 1970-01-01 00:00:00 的秒数。也叫做日历时&#xff0c;类型是 long &#xff08;2&#xff09;clock_t: 只用于程序计时&#xff0c;貌似其他的没它什…

【SAP UI5 控件学习】DAY03 Input组Part III

1. Input 控件 1.1 最简单的Input控件 在UI5框架中&#xff0c;最简单的Input控件也提供了输入提示功能。当用户输入内容的时候&#xff0c;会自动匹配Input控件中所绑定的JSON模型中是数据。 Input的默认匹配规则是匹配从头匹配每一个单词 前端代码如下&#xff1a; <mv…

Django新手必看:如何创建应用和定义数据表。看完这一篇就够了

1. Django创建应用 Django 项目就是基于 Django 框架开发的 Web 应用&#xff0c;它包含了一组配置和多个应用&#xff0c;我们把应用称之为App&#xff0c;在前文中对它也做了相应的介绍&#xff0c;比如 auth、admin&#xff0c;它们都属于 APP。一个 App 就是一个 Python 包…

这7个AI软件让设计效率飞起,快来收藏

伴随着AI技术的发展&#xff0c;设计师使用AI工具来提高工作效率已成为一种趋势&#xff0c;越来越多的AI工具也出现在市场上。本文收集了市场上7个好用的AI工具推荐给大家&#xff0c;一起来看看吧&#xff01; 1、即时 AI 即时 AI是一款依赖AI技术&#xff0c;实现网页设计…

梯度(第四节)

目录 一.总结 二.l的方向余弦 三.方向导数 四.方向导数和方向余弦的联系 五.梯度 1.定义 2.性质 3.运算公式 4.例题 六.最快下降法 一.总结 上一节我们研究了数量场和矢量场的宏观特征&#xff0c;但宏观特征&#xff0c;在细节上往往无法展现事物的真正全 貌&…

Instruct2Act:使用大型语言模型将多模态指令映射到机器人动作

Instruct2Act&#xff1a;使用大型语言模型将多模态指令映射到机器人动作 基础模型在多种应用中取得了重大进步&#xff0c;包括文本到图像的生成、全景分割和自然语言处理。本文提出了一个名为Instruct2Act的框架&#xff0c;该框架利用大型语言模型将多模态指令映射为机器人…

代码随想录算法学习心得 42 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II...

一、买卖股票的最佳时机 链接&#xff1a;力扣 描述&#xff1a;给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算…

iOS添加测试设备报错ineligible for 14 days

2023年7月8日申请苹果个人开发账号审核通过。 2023年7月10日在苹果开发平台分别创建Certificates、Identifiers、Devices添加一台测试设备、Profiles&#xff0c;将已经准备好的项目打包上传&#xff0c;使用testflight测试app&#xff0c;使用测试设备一切顺利。 2023年7月1…

中缀表达式转前、后缀表达式

中缀表达式&#xff1a;按照人为理解的运算优先顺序进行计算&#xff0c;如ab 前缀表达式&#xff1a;运算符在括号之前&#xff0c;如ab 后缀表达式&#xff1a;运算符提在括号之后&#xff0c;如ab 解题步骤&#xff1a; ①用括号把每一个表达式括起来(可以先全部括起来后挨…

RPC分布式网络通信框架(一)—— protobuf的使用

文章目录 一、protobuf的好处二、如何创建proto三、编译生成的C类UserServiceRpcUserServiceRpc_Stub四、序列化和反序列化序列化反序列化 粘包问题解决调用者组包提供者解包 一、protobuf的好处 1、protobuf是二进制存储的&#xff0c;xml和json都是文本存储的。故protobuf占…