【算法】迷宫问题

文章目录

  • 前言
  • 1.迷宫问题求解
    • 分步骤求解
    • 代码
  • 2.迷宫最短路径求解
    • 代码

前言

迷宫问题本质就是一个图的遍历问题,从起点开始不断四个方向探索,直到走到出口,走的过程中我们借助栈记录走过路径的坐标。

栈记录坐标有两方面的作用,一方面是记录走过的路径,一方面方便走到死路时进行回溯找其他的通路


1.迷宫问题求解

https://www.nowcoder.com/questionTerminal/cf24906056f4488c9ddb132f317e03bc

image-20230108211356520


分析

1.此处1表示墙壁不能走,0表示可以走的路

2.(0,0)位置是起点(入口), (N-1,M-1)是终点(出口)

3.所以思路就是从起点位置开始,向上下左右进行搜索。先判断位置是否合法,如果合法就递归往下继续搜索,不合法则走另一个位置进行搜索。如果四个方向都不合法,那么在保存坐标的容器删除当前位置的坐标。

4.因为是把最近的坐标弹出去,后进先出,所以使用的是栈保存坐标!

5.注意:由于最后输出的是从起点到终点的路径的坐标,栈自底往上才是答案,所以需要把栈的内容倒置过来


思路

0.由于我们要保存坐标的位置,这里可以使用pair,也可以自己定义一个结构体类型进行描述坐标

1.由于可能是循环输入例子,所以使用while(cin >> … )的方式输入N和M,然后开辟N*M的二维数组,输入数据。

2.从起点(0,0)位置开始调用递归函数GetMazePath找通路,题目已经说明了有唯一解!

3.首先要判断方向是否有效,有效才往那个方向走,只要GetMazePath中任意一个方向找到了通路就返回真,如果最后四个方向都不能走,就返回假


C语言如何开辟N*M的二维数组

//方式1:
int maze[N][M] //C99不支持这种方式
//方式2:动态开辟二维数组
int** maze = (int**)malloc(sizeof(int*)*N) //数字共有N个元素,每个元素都是int*(指向一个动态的数组),首元素的地址为int**  
for(int i = 0 ;i<N;i++)
{maze[i] = (int*)malloc(sizeof(int)*M);
}
//释放:先释放一维数组,然后才能释放二维数组,否则就会导致内存泄漏
for(int i = 0;i<N;i++)
{free(maze[i]);maze[i] = NULL;
}
free(maze);
maze = NULL;

分步骤求解

1.描述位置的结构体定义:

struct Postion
{int row;int col;Postion(int x, int y) :row(x), col(y){}
};

2.定义一个全局的Stack,记录通路上的位置坐标

stack<Postion> Path; //记录通路的路径下标位置

3.输出路径上的坐标的函数 (从起点到终点)

分析:由于Path栈中从栈底到栈顶才是题目要求的输出方式,所以我们需要把Path栈的内容进行倒置

void PrintPath()
{//将Path栈中的内容倒置才是输出顺序stack<Postion> rPath;while (!Path.empty()){rPath.push(Path.top());Path.pop();}//按格式输出内容while (!rPath.empty()){Postion top = rPath.top();printf("(%d,%d)\n", top.row, top.col);rPath.pop();}
}

4.辅助函数:判断能否往pos位置的方向走

分析:只要保证pos的坐标不是越界的 &&pos位置的值是0(题目说明0是通路)那么就可以往该位置走

bool IsPass(vector<vector<int>>& vv, Postion& pos)
{//获取迷宫的行和列int N = vv.size();int M = vv[0].size();//pos位置合法&&pos位置的值是0才是通路,才是可以往pos位置走//位置合法:位置的行>=0 && 位置的行<row && 位置的列>=0 && 位置的列<colif (pos.row >= 0 && pos.row < N && pos.col >= 0 && pos.col < M&& vv[pos.row][pos.col] == 0)return true;elsereturn false;
}

5.主递归函数:从cur位置开始往四个方向进行搜索,找通路

分析:先把当前位置坐标放到路径栈当中,然后判断当前位置是不是出口,不是则要往四个方向进行探索!

注意1:我们需要把当前坐标位置的值改为非0值,表示当前位置已经走过了,不走回头路!否则就造成死递归了。当然也可以置为1,因为题目已经说明了1代表的是墙

注意2:往四个方向进行探索,先要检测该方向位置是否合法,只要任一方向找到了通路就可以返回了!因为答案唯一,所以先往哪个方向走的顺序都可以。如果四个方向都找不到通路,说明当前cur位置是无效的位置,需要回溯,把cur位置从栈中弹出。

bool GetMazePath(vector<vector<int>>& vv, Postion cur)
{Path.push(cur);//先把当前位置坐标放到路径栈当中int N = vv.size();int M = vv[0].size();if (cur.row == N - 1 && cur.col == M - 1)//判断是否走到出口return true;vv[cur.row][cur.col] = 2;//把当前位置置成2,或者其它数字也可以,表示已经走过了!//往四个方向进行探测,顺序任意,因为答案唯一Postion nextUp{ cur.row - 1,cur.col };Postion nextDown{ cur.row + 1, cur.col };Postion nextLeft{ cur.row, cur.col - 1 };Postion nextRight{cur.row, cur.col + 1};//先判断能否往该方向走,如果能才往该方向进行下一步探索//只要任一方向的探测走到出口就返回真if (IsPass(vv, nextUp))//上{if (GetMazePath(vv, nextUp))return true;}if (IsPass(vv, nextDown))//下{if (GetMazePath(vv, nextDown))return true;}if (IsPass(vv, nextLeft))//左{if (GetMazePath(vv, nextLeft))return true;}if (IsPass(vv, nextRight))//右{if (GetMazePath(vv, nextRight))return true;}//来到这里,说明当前位置往四个方向走都不能得到通路Path.pop();//当前位置不是路径上的位置return false;
}

6.主函数

分析:定义二维数组,然后输入数据,从起点(0,0)位置开始递归找通路,一定可以找到!然后输出路径上的坐标

int main()
{int N, M;while (cin >> N >> M){vector<vector<int>> maze(N, vector<int>(M));for (int i = 0; i < N; i++)for (int j = 0; j < M; j++)cin >> maze[i][j];Postion start{ 0,0 };//起点位置if (GetMazePath(maze, start))//从起点位置开始探索找通路{//找到通路了,输出路径PrintPath();}else{//没有通路,题目已经说明有唯一解,所以不可能走这里cout << "没有通路" << endl;}}return 0;
}

代码

#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct Postion
{int row;int col;Postion(int x, int y) :row(x), col(y){}
};stack<Postion> Path; //记录通路的路径下标位置
//输出路径上的坐标 起点->终点
void PrintPath()
{//将Path栈中的内容倒置才是输出顺序stack<Postion> rPath;while (!Path.empty()){rPath.push(Path.top());Path.pop();}//按格式输出内容while (!rPath.empty()){Postion top = rPath.top();printf("(%d,%d)\n", top.row, top.col);rPath.pop();}
}
//判断能否往pos位置走
bool IsPass(vector<vector<int>>& vv, Postion& pos)
{//获取迷宫的行和列int N = vv.size();int M = vv[0].size();//pos位置合法&&pos位置的值是0才是通路,才是可以往pos位置走//位置合法:位置的行>=0 && 位置的行<row && 位置的列>=0 && 位置的列<colif (pos.row >= 0 && pos.row < N && pos.col >= 0 && pos.col < M&& vv[pos.row][pos.col] == 0)return true;elsereturn false;
}
//从cur位置开始往四个方向进行搜索,找通路
bool GetMazePath(vector<vector<int>>& vv, Postion cur)
{Path.push(cur);//先把当前位置放到路径栈当中int N = vv.size();int M = vv[0].size();if (cur.row == N - 1 && cur.col == M - 1)//判断是否走到出口return true;vv[cur.row][cur.col] = 2;//把当前位置置成2,或者其它数字也可以,表示已经走过了!//往四个方向进行探测,顺序任意,因为答案唯一Postion nextUp{ cur.row - 1,cur.col };Postion nextDown{ cur.row + 1, cur.col };Postion nextLeft{ cur.row, cur.col - 1 };Postion nextRight{cur.row, cur.col + 1};//先判断能否往该方向走,如果能才往该方向进行下一步探索//只要任一方向的探测走到出口就返回真if (IsPass(vv, nextUp))//上{if (GetMazePath(vv, nextUp))return true;}if (IsPass(vv, nextDown))//下{if (GetMazePath(vv, nextDown))return true;}if (IsPass(vv, nextLeft))//左{if (GetMazePath(vv, nextLeft))return true;}if (IsPass(vv, nextRight))//右{if (GetMazePath(vv, nextRight))return true;}//来到这里,说明当前位置往四个方向走都不能得到通路Path.pop();//当前位置不是路径上的位置return false;
}
int main()
{int N, M;while (cin >> N >> M){vector<vector<int>> maze(N, vector<int>(M));for (int i = 0; i < N; i++)for (int j = 0; j < M; j++)cin >> maze[i][j];Postion start{ 0,0 };//起点位置if (GetMazePath(maze, start))//从起点位置开始探索找通路{//找到通路了,输出路径PrintPath();}else{//没有通路,题目已经说明有唯一解,所以不可能走这里cout << "没有通路" << endl;}}return 0;
}

2.迷宫最短路径求解

https://www.nowcoder.com/questionTerminal/571cfbe764824f03b5c0bfd2eb0a8ddf

image-20230108225638043


分析:

1.此题中多了体力的限制,向上移动消耗3体力,向下移动不消耗体力值,向左向右消耗1体力

2.并且此时位置的值是0代表的是到不了的位置(可以理解为墙),位置的值是1表示通路

3.此时的入口是(0,0)位置,出口是(0,m-1)位置(右上角)

4.题目中要求选出体力消耗最小的路径 ,可以理解为求的是最短路径。此时可能没办法逃出迷宫,比如:体力值为负数

所以此处我们要准备两个栈:当前路径栈以及保存答案的栈,需要注意:并不是最短的路径就是答案,因为有体力的消耗,用体力值来过滤路径的合法性


如何找出最优解呢?

把所有的通路都找出来,然后比较,找出最短的路径。此时体力值也是限制选择路径的一个因素!


和上一个题的不同之处

1.此时1代表的是通路,0代表的是墙,所以能否往pos位置走的代码需要变动

if (pos.row >= 0 && pos.row < N && pos.col >= 0 &&pos.col< M&&vv[pos.row][pos.col] == 1)

2.此处的输出格式也有变化

3.1:在GetMazePath函数当中,此时不再需要返回值了,因为此时要找最短的路径,找到了一条通路之后,还需要回溯继续找。

3.2:因为我们是先把当前位置置为2,所以最后四个方向走完回溯的时候,还需要"恢复现场",把当前位置重新置为1

3.3:由于有体力值的消耗,所以我们要给GetMazePath函数多增加一个体力值的参数

3.4:此时的迷宫出口是右上角位置:(0,M-1),如果当前位置是出口,那么就判断是否需要更新答案栈,条件为:体力值>=0 && 第一次进入栈为空 || 路径栈的大小 < 答案栈的大小


代码

#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct Postion
{int row;int col;Postion(int x, int y) :row(x), col(y){}
};stack<Postion> Path; //记录通路的路径下标位置
stack<Postion> ansPath;//保存最短路径的栈//输出路径上的坐标 起点->终点
void PrintPath()
{//将ansPath栈中的内容倒置才是输出顺序stack<Postion> rPath;while (!ansPath.empty()){rPath.push(ansPath.top());ansPath.pop();}//按格式输出内容  最后一个坐标不加, 所以需要分成两部分打印//当然也可以在内部判断rPath.size()是否为1,然后打印while (rPath.size() > 1){Postion top = rPath.top();printf("[%d,%d],", top.row, top.col);rPath.pop();}Postion top = rPath.top();printf("[%d,%d]", top.row, top.col);rPath.pop();
}//判断能否往pos位置走
bool IsPass(vector<vector<int>>& vv, Postion& pos)
{//获取迷宫的行和列int N = vv.size();int M = vv[0].size();//pos位置合法&&pos位置的值是1才是通路,才是可以往pos位置走//位置合法:位置的行>=0 && 位置的行<row && 位置的列>=0 && 位置的列<colif (pos.row >= 0 && pos.row < N && pos.col >= 0 && pos.col < M&& vv[pos.row][pos.col] == 1)return true;elsereturn false;
}
//从cur位置开始往四个方向进行搜索,找通路
void GetMazePath(vector<vector<int>>& vv, Postion cur, int P)
{Path.push(cur);//先把当前位置放到路径栈当中int N = vv.size();int M = vv[0].size();if (cur.row == 0 && cur.col == M - 1)//判断是否走到出口{//体力值衡量的是这条路径是否有效if (P >= 0 && ansPath.empty() || Path.size() < ansPath.size()){//更新答案栈ansPath = Path;//深拷贝}}vv[cur.row][cur.col] = 2;//把当前位置置成2,或者其它数字也可以,表示已经走过了!//往四个方向进行探测,顺序任意,因为答案唯一Postion nextUp{ cur.row - 1,cur.col };Postion nextDown{ cur.row + 1, cur.col };Postion nextLeft{ cur.row, cur.col - 1 };Postion nextRight{ cur.row, cur.col + 1 };//先判断能否往该方向走,如果能才往该方向进行下一步探索if (IsPass(vv, nextUp))//上 ->消耗3体力GetMazePath(vv, nextUp,P - 3);if (IsPass(vv, nextDown))//下 ->不消耗体力GetMazePath(vv, nextDown, P);if (IsPass(vv, nextLeft))//左 ->消耗1体力GetMazePath(vv, nextLeft, P - 1);if (IsPass(vv, nextRight))//右 ->消耗1体力GetMazePath(vv, nextRight, P - 1);//无论是四个方向都走不通还是已经找到通路//都要恢复现场进行回溯 -> 位置置1并且在路径栈弹出当前坐标,继续探索找最短路径vv[cur.row][cur.col] = 1;Path.pop();
}
int main()
{int N, M, P;while (cin >> N >> M >> P){vector<vector<int>> maze(N, vector<int>(M));for (int i = 0; i < N; i++)for (int j = 0; j < M; j++)cin >> maze[i][j];Postion start{ 0,0 };//起点位置GetMazePath(maze, start, P);//从起点位置开始探索找通路if(!ansPath.empty())//找到最短的通路了,输出路径PrintPath();elsecout << "Can not escape!" << endl;}return 0;
}

为什么这里最后可以直接恢复现场:vv[cur.row][cur.col] = 1呢,会不会把原来0的位置改成1?不会!因为如果vv[cur.row][cur.col] 是0的话,在if判断当中就不能往这个位置走,不会进入递归。所以凡是能进入GetMazePath函数的,其位置的值一定是1


另一种写法

要求的是体力消耗最小的路径,所以我们定义一个变量记录每条通路的体力值,然后比较,满足条件再更新

#include <bits/stdc++.h>using namespace std;vector<pair<int, int>> gpath;//迷宫
int max_life = -1; //记录最大体力值
/*
g:记录最终答案  
visited:记录位置是否考察过(记得要恢复现场) 
x和y:当前位置的坐标 
life:剩余体力值path:
path:当前通路上的坐标集合
*/
void dfs(vector<vector<int>> &g, vector<vector<int>> &visited, int x, int y, int life, vector<pair<int, int>> &path) {//越界 || 当前位置已经考察过了 || 体力值<0 就返回if (x < 0 || x >= g.size() || y < 0 || y >= g[0].size() || g[x][y] == 0 ||visited[x][y] || life < 0) {return;}path.push_back(make_pair(x, y));//保存当前坐标if (x == 0 && y == g[0].size() - 1)  //迷宫出口{if (life > max_life)  //当前通路的体力值剩余更多{gpath = path;max_life = life;}path.pop_back();//在当前通路上的坐标集合中弹出当前坐标,然后继续回溯找return;}visited[x][y] = 1;//表示当前位置已经考察过了//向四个位置进行搜索dfs(g, visited, x - 1, y, life - 3, path);//上dfs(g, visited, x + 1, y, life, path);//下dfs(g, visited, x, y - 1, life - 1, path);//左dfs(g, visited, x, y + 1, life - 1, path);//右//在当前通路上的坐标集合中弹出当前坐标,然后继续回溯找,并且恢复现场path.pop_back();visited[x][y] = 0;//恢复现场,没考察过
}void show_path(vector<pair<int, int>> &path) {for (int i = 0; i < path.size(); ++i) {cout << '[' << path[i].first << ',' << path[i].second << ']';if (i < path.size() - 1) {cout << ',';}}
}int main() {int n, m, life;cin >> n >> m >> life;vector<vector<int>> grids(n, vector<int>(m));vector<pair<int, int>> path;vector<vector<int>> visited(n, vector<int>(m, 0));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> grids[i][j];}}dfs(grids, visited, 0, 0, life, path);if (!gpath.empty()) {show_path(gpath);} else {cout << "Can not escape!" << endl;}return 0;
}

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

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

相关文章

Git配置SSH

前言&#xff1a; Git是分布式的代码管理工具&#xff0c;远程的代码管理是基于SSH的&#xff0c;所以要使用远程的Git则需要SSH的配置 温馨提示&#xff1a; 1.查看是否已经有了ssh公钥&#xff1a;cd ~/.ssh 如果没有则不会有此文件夹&#xff0c;有则删除 一、git 配置 &a…

【HarmonyOS】【DevEco Studio】盘点DevEco Studio日志获取途径

【关键词】 DevEco Studio、日志获取 【问题背景】 在收到IDE工单的时候&#xff0c;很多时候开发者出现的问题都需要提供一些日志&#xff0c;然后根据日志分析&#xff0c;那么你知道IDE各种日志的获取方式么&#xff1f;往下看 【获取方法】 一、idea.log获取 IDE界面H…

【数据结构】二叉树的层序遍历(四)

目录 一&#xff0c;层序遍历概念 二&#xff0c;层序遍历的实现 1&#xff0c;层序遍历的实现思路 2&#xff0c;创建队列 Queue.h Queue.c 3&#xff0c;创建二叉树 BTree.h BTree.c 4&#xff0c;层序遍历的实现 一&#xff0c;层序遍历概念 层序遍历&#xff1a;除了先序…

大模型助力企业数据驱动,火山引擎数智平台发布AI助手

9月19日&#xff0c;火山引擎在其举办的“V-Tech数据驱动科技峰会”上宣布&#xff0c;火山引擎数智平台VeDI推出“AI助手”&#xff0c;通过接入人工智能大模型&#xff0c;帮助企业提升数据处理和查询分析的效率。即使是不会写代码的运营人员&#xff0c;和大模型对话也能做好…

基于conda的相关命令

conda 查看python版本环境 打开Anaconda Prompt的命令输入框 查看自己的python版本 conda env list激活相应的python版本(环境&#xff09; conda avtivate python_3.9 若输入以下命令可查看python版本 python -V #注意V是大写安装相应的包 pip install 包名5.查看已安装…

stm32----ADC模数转换

一、ADC介绍 ADC&#xff0c;即模数转换器&#xff0c;它可以将模拟信号转化为数字信号。在stm32种一般有3个ADC&#xff0c;每个ADC有18个通道。 12位ADC是一种逐次逼近型模拟数字转换器&#xff0c;它有多达18个通道&#xff0c;可测量16个外部和两个内部信号源。各个通道的A…

物 理 层

二、物理层 1、物理层的基本概念 物理层的作用:尽可能的屏蔽掉传输媒体和通信手段的差异&#xff0c;使物理层上面的数据链路层感觉不到这些差异&#xff0c;使其只需要考虑如何完成本层的协议和服务 1.1、物理层的主要任务 机械特性&#xff1a;指明接口所用的接线器的形状…

Windows10/11无线网卡WIFI驱动详细下载安装教程

官网下载WIFI驱动 《intel官网》 找到下载Windows 10 and Windows 11* WiFi package drivers 查看详细信息 下载对应操作系统的WIFI驱动 安装驱动&#xff0c;然后重启电脑即可。

掌动智能浅谈UI自动化测试工具的重要性

在现代软件开发中&#xff0c;用户界面(UI)的质量和可靠性对于一个应用的成功至关重要。为了确保应用在各种环境和设备上都能正常运行&#xff0c;开发团队需要进行全面的UI测试。为了提高测试效率和减少人为错误&#xff0c;UI自动化测试工具成为不可或缺的工具。本文将探讨UI…

解决Python中的JSON序列化Bug TypeError: Object of type ‘int64‘ is not JSON serializable

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

uni-app:实现条件判断展示图片(函数判定+三目运算)

一、多条件判断&#xff08;通过函数进行图片展示&#xff09; 效果 代码 在data中定义图片信息和要传递的数据信息&#xff0c;在src中写入函数并携带要传递的数据&#xff0c;通过传递的数据在函数中进行判断&#xff0c;并返回对应的图片信息 <template><view&…

安防监控系统/视频云存储EasyCVR平台视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Hadoop:YARN、MapReduce、Hive操作

目录 分布式计算概述 YARN概述 YARN架构 核心架构 辅助架构 MapReduce 概述 配置相关文件 提交MapReduce到YARN Hive Hive架构 Hive在VMware部署 Hive的启动 数据库操作 数据表操作 内部表操作 外部表操作 数据加载和导出 数据加载LOAD 数据加载 - INSERT SEL…

QT--day3

2> 完成文本编辑器的保存工作 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_fontbtn_cl…

【排障记录】扩展坞USB 3.0能用而2.0不能用

一、症状表现 日常使用小米的一个扩展坞连接笔记本&#xff0c;平时用来插U盘&#xff0c;没有什么问题&#xff0c;但是今天插了鼠标键盘&#xff0c;发现根本不识别 二、排查过程 目前的连接结构 笔记本C口→type-C延长线→扩展坞A→设备 1.排查笔记本故障 将键盘鼠标插…

Python灰帽编程——错误异常处理与面向对象

文章目录 错误异常处理与面向对象1. 错误和异常1.1 基本概念1.1.1 Python 异常 1.2 检测&#xff08;捕获&#xff09;异常1.2.1 try except 语句1.2.2 捕获多种异常1.2.3 捕获所有异常 1.3 处理异常1.4 特殊场景1.4.1 with 语句 1.5 脚本完善 2. 内网主机存活检测程序2.1 scap…

QT:使用行编辑器、滑动条、滚动条、进度条、定时器

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> //行编辑器 #include <QSlider> //滑动条 #include <QScrollBar> //滚动条 #include <QProgressBar> //进度条 #include <QTimer> …

JDK8新特性

Lembda表达式 lembda表达式是一个简洁、可传递的匿名函数,实现了把代码块赋值给一个变量的功能 是我认为jdk1.8中最让人眼前一亮的特性&#xff08;我没用过其他函数式的语言&#xff09; 在了解表达式之前&#xff0c;我们先看两个概念 函数式接口 含有且仅含有一个抽象方法&…

随手笔记(四十五)——idea git冲突

图片为引用&#xff0c;在一次导入项目至gitee的过程中&#xff0c;不知道为什么报了403&#xff0c;很奇怪的一个错误&#xff0c;网上很多的答案大概分成两种。 第一种是最多的&#xff0c;直接找到windows凭据删掉 很抱歉的告诉各位&#xff0c;你们很多人到这里就已经解…

Python基础数据结构入门必读指南

更多资料获取 作者主页&#xff1a;涛哥聊Python 个人网站&#xff1a;涛哥聊Python 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享的是Python中常见的数据结构。 1.数组 含义&#xff1a;数组是一种有序的数据结构&#xff0c;其中的元素可以按照索引来访问。数组…