项目需求

2018 年 11 月 26 日,“洞察”号火星探测器在火星上成功着陆,执行人类首次探究火星“内 心深处”的任务。火星上地形比较复杂,高低起伏,有山峰和低谷,稍有不慎,就会引起“翻 车”。因此我们必须要识别地形上的各个最高点(峰点)和最低点(谷点),以便为探测器 提供导航数据。

峰点就是一个其周围所有点的海拔都低于它的点

203

109

181

289

300

264

190

250

188

现在我们要做的就是分析来自地图上的海拔数据,以确定地形中峰点的数目和位置

二维数组

数组,就是多个同类型的元素的有序“组合”。如下的一组女兵,注:同类型是指都是女兵,不能混入男兵 -:)

二维数组,就是指含有多个数组的数组!

如果把一维数组理解为一行数据,那么,二维数组可形象地表示为行列结构。

二维数组的定义

和数组一样,需要先定义,再使用。

int a[25] ; //一行女兵实例:

int      a[5][25];     //五行女兵

//定义了一个二维数组,

//数组名是“a”,

//包含 5 行 25 列,共 125 元素,

//每个元素是 int 类型的变量

二维数组的初始化

int a[3][4];  //二维数组元素的值可能是随机的(全局变量会初始化为 0,局部变量值随机)

方式一 初始化时指定每行的值

int a[3][4]={    //等效于 int a[][4]

{1,     2,     3,     4},

{5,     6,     7,     8},

{9,    10,    11,   12}

};

注:最外围括号内部的每个括号相当于初始化一行,括号中可以省略某些元素的初始化

方式二初始化时从头开始,依次序进行

int a[3][4]={ 1,2,3,4,5,6,7,8,9,10,11,12};

int a[3][4]={ 0}; //所有元素都初始化为 0

注:后面的多个元素可以不指定,不指定全部初始化为 0

#include <stdlib.h> #include <stdio.h>

int main(void){

//int ages[5][25];//定义一个二维数组 int i=0, j=0;

//初始化

//第一种方式 初始化时指定每行的值

int a[3][4]={

{1},//省略掉得列会默认置零

{5,6,7},

{9,10,11,12}

};

//第二种方式 初始化时从头开始,依次序进行

int a1[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int a2[3][4]={1};//只初始化第一个,其他得默认置零

for(i=0; i<3; i++){ for(j=0; j<4; j++){ printf("%d ", a[i][j]);

}

printf("\n");

}

system("pause");

return 0;

}

二维数组的访问

a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

a[0][0]

1

a[0][1]

2

a[0][2]

3

a[0][3]

4

a[1][0]

5

a[1][1]

6

a[1][2]

7

a[1][3]

8

a[2][0]

9

a[2][1]

10

a[2][2]

11

a[2][3]

12

如下图表示,左侧表示的是一个大小为M+1的一维数组,右侧表示的是一个大小为(M+1)*(N+1)的二维数组。

int i=0, j=0; int a[3][4];

//给数组成员赋值

for(int i=0;i<12; i++){ a[i/4][i%4] = i+1;

}

//或

for(int i=0;i<3; i++){ for(int j=0;j<4; j++){ a[i][j] = 4*i+j+1;

}

}

//输出

for(int i=0;i<3; i++){ for(int j=0;j<4; j++){ printf("%d ",a[i][j]);

} printf("\n");

}

11

二维数组的存储方式

设置断点调试,可以看到二位数组中的所有元素在内存中的存储方式

多维数组

上面讨论的二维数组的相关内容都适用于三维数组或更多维的数组。声明一个三维数组: int girl[3][8][5];

可以把一维数组想象成一排女兵,把二维数组想象成一个女兵方阵,把三维数组想象成多个女兵方阵。这样,当你要找其中的一个女兵时,你只要知道她在哪个方阵(从 0、1、2 中选择),在哪一行(从 0-7)中选择,在哪一列(从 0-4 中选择)

二维数组作为函数的参数

切记!数组作为函数的参数传递,不是单纯的值传递,传递的是数组本身。

二维数组作为函数的参数:

#include <stdio.h>

#include <stdlib.h>

//版本1 指明参数

void print1(int a[3][4]){ for(int i=0;i<3; i++){ for(int j=0;j<4; j++){ printf("%d ",a[i][j]);

}

printf("\n");

}

}

//版本1 省略一个高维参数

void print2(int a[][4], int lines){ for(int i=0;i<lines; i++){ for(int j=0;j<4; j++){ printf("%d ",a[i][j]);

}

printf("\n");

}

}

int main(void){

//int arr[3][4]={{},{3,4}}; int a[3][4]={0}; int i=0; int j=0;

//给数组成员赋值

for(int i=0;i<3; i++){ for(int j=0;j<4; j++){ a[i][j] = 4*i+j;

}

}

print1(a);

print2(a);

}

常见错误总结

数组定义时编译器不能确定数组的大小

int a[3][] ; int a[][4] ;

int a[3][]={{1,2},{3,4},{5,6}}

一条原则:仅定义时(无初始化)不能省略,有初始化可以省略高维

严禁数组越界

在使用数组时,要防止数组下标超出边界。也就是说,必须确保下标是有效的值。

int a[10] ;         a[10]=100;    //错误,访问越界,a[10] 的成员是 a[0] - a[9]

int a[3][4];      a[3][0]=666; //错误, a[3][4] 包含了 3 行 4 列的数组,行下标也是从 0 开始,有效范围 0 - 2

数组(无论几维)传参并不是整个数组的复制

#include <stdio.h>

#include <stdlib.h> //int arr[3][4];

void fun(int a[3][4]){

for(int i=0;i<3;i++){

for(int j=0;j<4;j++){ a[i][j]=0;

}

}

}

int main(void){

//int arr[3][4]={{},{3,4}};

int a[3][4]={0};

int i=0; int j=0;

//给数组成员赋值

for(int i=0;i<3; i++){

for(int j=0;j<4; j++){

a[i][j] = 4*i+j;

}

}

fun(a);

//输出

for(int i=0;i<3; i++){

for(int j=0;j<4; j++){

printf("%d ",a[i][j]);

}

printf("\n");

}

项目实现

假设下面的数据代表一个 6 x 7 的网格, 加了下划线的网格即为峰点。

5039    5127   5238    5259   5248    5310   5299

5150    5392   5410    5401   5320    5820   5321

5290    5560 5490    5421   5530    5831 5210

5110    5429    5430    5411   5459    5630   5319

4920    5129   4921    5821 4722    4921   5129

5023    5129   4822    4872   4794    4862   4245

为了描述峰点的位置,我们需要使用一个位置方案:使用二维数组描述

假定左上角是[0][0],那么向下移动,则行号加 1;向右移动,则列号加 1, 那么这些峰点的位置就可以描述为:[2][1]   [2][5]    [4][3]。

位置确定后,与周围 4 个邻节点比较即可确定峰点!(注:网格边界点缺乏 4 个相邻点不计算峰点)地形数据保存于文件中。

算法设计

  1. 将地形数据从文件读入二维数组;
  2. 逐行遍历二维数组的每个元素,确定是否峰值并打印结果。
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>using namespace std;#define N 64bool isPeak(int map[N][N], int nrows, int ncols)
{if ((map[nrows][ncols] > map[nrows + 1][ncols]) &&(map[nrows][ncols] > map[nrows - 1][ncols]) &&(map[nrows][ncols] > map[nrows][ncols + 1]) &&(map[nrows][ncols] > map[nrows][ncols] - 1)){return true;}else{return false;}
}int main(void)
{string filename;fstream file;int map[N][N];int ncols, nrows;cout << "请输入你要打开的文件:";cin >> filename;file.open(filename.c_str());if (file.fail()){cerr << "打开文件失败" << endl;exit(1);}file >> nrows >> ncols;if (nrows > N || ncols > N){cerr << "行或列超出指定范围" << endl;exit(1);}for (int i = 0; i < nrows; i++){for (int j = 0; j < ncols; j++){file >> map[i][j];}}for (int i = 1; i < nrows-1; i++){for (int j = 1; j < ncols-1; j++){if (isPeak(map, i, j)){cout << "行:" << i << "列" << j << "峰值" << map[i][j] << endl;}}}file.close();system("pause");return 0;
}

人工智能之地形导航系统相关推荐

  1. 零基础学习C++系列课程(一) 持续更新中

    目录 第 1 节:课程目标 项目 1:C++基础编程-黑客攻击系统(含 6 个子项目) 项目 2:C++基础编程-人工智能之地形导航系统 项目 3:C++基础编程-人工智能之双色球预测系统 项目 4: ...

  2. 「认识AI:人工智能如何赋能商业」【02】人工智能规划

    作者 | Harper 审核 | gongyouliu 编辑 | auroral-L 人工智能规划 在上世纪70年代到80年代,符号系统被用来创建可以做出专家决策的人工智能软件.但是早期的专家系统在8 ...

  3. 科研笔记(一) 室内定位技术讲解

    Hello,everyone! 我是鲁班·,一个热衷于科研和软开的胖子! 目录 发展背景 技术分类 国内外主要实验室.学者和赛事 10年来有价值的参考文献 发展背景 迄今为止,室内定位技术已经发展了二 ...

  4. 硅谷最有权势的人:孙正义和他的愿景帝国

    关注网易智能,聚焦AI大事件,读懂下一个大时代! 选自| FastCompany 作者| Katrina Brooker 编译| 网易智能(公众号 smartman163) 参与| 小小 与美国亿万富 ...

  5. 【19调剂】北京航空航天大学苏州创新研究院培养基地非全日制硕士研究生招生说明(校内)...

    点击文末的阅读原文或者公众号界面左下角的调剂信息或者公众号回复"调剂"是计算机/软件等专业的所有调剂信息集合,会一直更新的. 一.北航苏州创新研究院简介 北航苏州创新研究院于 20 ...

  6. 人工智能AI在智能交通领域中的应用

    摘要 人工智能(AI)是指机器执行人类能够轻松完成的感知.推理.学习和解决问题等认知功能的能力.过去20年以来,由于互联网产生的海量数据的可用性,人工智能在全球范围内获得了关注.最近,使用高级算法处理 ...

  7. 《中国人工智能系列白皮书——智能驾驶》精编

    [转] https://www.leiphone.com/news/201710/x7tHyZS8lsohsatP.html 10月12日,中国人工智能学会发布中国人工智能系列白皮书,雷锋网作为邀请媒 ...

  8. Unity 3D 人形角色动画(Avatar)||Unity 3D 导航系统||Unity 3D 障碍物

    Unity 3D 人形角色动画(Avatar) Mecanim 动画系统适合人形角色动画的制作,人形骨架是在游戏中普遍采用的一种骨架结构.. 由于人形骨架在骨骼结构上的相似性,用户可以将动画效果从一个 ...

  9. Unity 3D 导航系统||Unity 3D 障碍物

    Unity 3D 导航系统 过去,游戏开发者必须自己打造寻路系统,特别是在基于节点的寻路系统中,必须手动地在 AI 使用的点之间进行导航,因此基于节点系统的寻路非常烦琐. Unity 3D 不仅具有导 ...

最新文章

  1. CV领域中的Bert,了解一下?
  2. [py]django url 参数/reverse和HttpResponseRedirect
  3. 1.2 matlab数值数据的输出格式
  4. 计算机视觉与深度学习 | 粒子群算法与遗传算法(GA)及与蚁群算法(ACO)比较
  5. 虚拟机Centos7配置网络
  6. 从零开始学PowerShell(3)筛选的力量
  7. php手册学习怎样,PHP新手之如何学习PHP的讲解
  8. android bitmap大小计算,android 之Bitmap 内存大小计算
  9. 如何在无显示器的ubuntu下跑selenium
  10. 机器视觉系统中相机的分辨率怎么选择?
  11. 重磅!李航《统计学习方法》最新资源,笔记、Python 代码一应俱全!
  12. 如何自定义苹果Mac睡眠时间,掌握作息?
  13. swift 3.0 协议笔记
  14. 【事件驱动】【数码管识别】(C++多线程实现多幅图像的同步识别)
  15. 计算机旅游网站毕业论文,旅游网站的设计与实现(毕业论文)
  16. 【信号检测】基于双稳随机共振微弱信号检测含Matlab源码
  17. pdf加水印方法,快速给pdf加水印
  18. 嵌入式和单片机的区别在哪?
  19. Centos下安装FastDFS
  20. 云南大学计算机专业双一流排名,盘点:42所“双一流”大学的一流学科!

热门文章

  1. 目标转化出价多少_头条信息流广告目标转化出价(ocpc出价)常见问题讲解
  2. DELL SCv3020存储日常运维
  3. 电子表格控件Aspose.Cells V17.5全新发布 | 附下载
  4. 鸿蒙系统下的搜狗输入法,搜狗输入法率先适配iPhone 11深色模式,用搜狗就对了!...
  5. 对啊,就是嫌你穷才分手的啊
  6. discuz mysql 类_Discuz论坛中的的MySQL类解析
  7. Oracle数据库基础(二)
  8. golang打造p2p网络
  9. 京东商品搜索架构设计
  10. kafka segment file 解析