【算法作业】实验五:神奇宝贝大军 & 到迷宫出口的最短路径

简介: 【算法作业】实验五:神奇宝贝大军 & 到迷宫出口的最短路径

第一题:神奇宝贝大军


1.题目

image.png


输入描述

输入第一行包含一个整数n表示神奇宝贝的个数

输入第二行n个不同的整数,表示神奇宝贝的力量

输出描述

输出一个整数表示军队可以取得的最大力量

样式输入

7

1 2 5 4 3 6 7

样式输出

9

样式解析

构造军队的方式为5 3 7,军队力量为5-3+7=9


2.问题分析与算法设计思路

类似地将皮卡丘的战斗力与标号的关系看作函数:a = f ( b ) a=f(b)a=f(b)。则我们只需遍历一次这些皮卡丘,同时过程中挑出所有的极大值和极小值,然后将这些皮卡丘作为军队,即可取得最大军队力量。


为什么这样可以得到最大的军队力量?自己举几个例子就能发现,不取极值点的情况,总可以用取了极值点的情况来替代同时获得更大的军队力量。


或者,你可以发现军队力量将来自函数曲线的下降阶段。若从前往后每两只神奇宝贝为一组,则每一组都相当于在曲线上截取一段;截取的下降落差越大,则军队的力量越大。而前面介绍的神奇宝贝挑选方法,将覆盖曲线上所有的下降阶段。(如果曲线右端是上翘的,可以等效为最后再加一只战斗力为 0 的神奇宝贝)


image.png


3.算法实现

1)更新版本

1-更新介绍

记住我们的目标是:尽可能截取函数的下降阶段。


主要改变了极大值和极小值的判定方式:


极大值:对于a [ i ] a[i]a[i],需满足a [ i ] > a [ i − 1 ] 且 a [ i ] > a [ i + 1 ] a[i]>a[i-1]且a[i]>a[i+1]a[i]>a[i−1]且a[i]>a[i+1]

极小值:对于a [ i ] a[i]a[i],需满足a [ i ] < a [ i − 1 ] 且 a [ i ] < a [ i + 1 ] a[i]<a[i-1]且a[i]<a[i+1]a[i]<a[i−1]且a[i]<a[i+1]

这样判断极值点更加清晰明确


对于端点单独考虑:


左端点:若a [ i ] > a [ i + 1 ] a[i]>a[i+1]a[i]>a[i+1],则作为极大值。永远不作为极小值。

右端点:若a [ i ] > a [ i − 1 ] a[i]>a[i-1]a[i]>a[i−1],则作为极大值;若a [ i ] < a [ i − 1 ] a[i]<a[i-1]a[i]<a[i−1],则作为极小值;

程序过程:


输入神奇宝贝数组

遍历数组,对每个点进行分类(非极值点、极大值点、极小值点)

遍历过程中,每找到一个极小值(在这之前一定也找到了一个极大值),更新一次军队总战斗力:

总战斗力 + = 极大值 − 极小值 总战斗力+=极大值-极小值总战斗力+=极大值−极小值

2-版本代码

#include<iostream>
using namespace std;
const int Big = 100;//神奇宝贝最大数量 
int amy(int bkm[], int n){
  int sum = 0;//总战斗力
  int max = 0;//极大值
  int min = 0;//极小值 
  //左端点 
  if(bkm[0] > bkm[1]){
  max = bkm[0];
  }
  //中间部分 
  for(int i = 1; i <= n-2; i++){
  bool found_min = false;//本次循环是否找到极小值 
  if(bkm[i] > bkm[i-1] && bkm[i] > bkm[i+1]){
    max = bkm[i];
  }
  else if(bkm[i] < bkm[i-1] && bkm[i] < bkm[i+1]){
    min = bkm[i];
    found_min = true;
  }
  if(found_min){
    sum += max - min;
  }
  }
  //右端点 
  if(bkm[n-1] < bkm[n-2]){
  min = bkm[n-1];
  sum += max - min;
  }
  return sum;
}
int main(){
  int bkm[Big] = {};//所有神奇宝贝的战斗力 
  int n = 0;//神奇宝贝的数量 
  //输入 
  cin>>n;
  for(int i = 0; i < n; i++){
  cin>>bkm[i];
  }
  int sum = amy(bkm, n);
  cout<<sum;
  return 0;
}

2)初有问题版本

1-找到问题的输入测试

输入

5

5 1 4 1 7

运行结果


image.png


2-问题原因

代码中同时进行神奇宝贝的输入和处理,在找极大值和找极小值过程的衔接有问题。


后面改来改去,老出现新的bug,就干脆重写了。


3-版本代码

#include<iostream>
using namespace std;
int main(){
  int n=0;
  int temp=0;
  int sum=0;//军队的总战斗力 
  int i=0;
  int a=0;
  int b=0;
  cin>>n;
  while(true){  
  cin>>a;
  i++;
  //找局部最大值
  while(i<n){
    cin>>b;
    i++;
    if(a<b) a = b;
    else break;
  }
  int max = a;
  if(i == n){
    sum += max;
    break;
  }
  //找局部最小值
  while(i<n){
    cin>>b;
    i++;
    if(a>b) a = b;
    else break;
  }
  int min = a;
  if(i == n){
    sum += min;
    break;
  }
  //作差,加入总战斗力 
  sum += max - min;
  }
  cout<<sum;
  return 0;
}

4.运行结果


image.png

5.算法分析

时间复杂度为:o ( n ) o(n)o(n)。


第二题:到迷宫出口的最短路径


1.题目

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

输入描述

第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符’.‘表示空地,’#'表示墙,'S’表示起点,'T’表示出口。只能进行上、下、左、右四个方向的搜索。输出从起点到出口最少需要走的步数。

样式输入

3 3

S#T

.#.

...

样式输出

6


2.问题分析与算法设计思路

采用回溯法的思路,不过为了提高算法的效率,可以在搜索的过程中记录走过的地方。使用深度优先和广度优先都是可以的,我这里使用的深度优先搜索。


3.算法实现

代码:


//迷宫起点到出口的最短路径 
#include<iostream>
using namespace std;
int count=123456789;//到出口所用步数 
void dfs(char mg[100][100], int n, int m, int xy[2], int BuShu){
//  cout<<"xy:"<<xy[0]<<' '<<xy[1]<<endl;
  //出来了吗?
  if(mg[xy[0]][xy[1]] == 'T'){
  if(BuShu < count){
    count = BuShu;
  }
  return;
  } 
  //1
  if(xy[0] < n - 1) {
  mg[xy[0]][xy[1]] = '#';
  xy[0]++;
  if(mg[xy[0]][xy[1]] != '#'){
//    cout<<"下"<<endl;
    dfs(mg,n,m,xy,BuShu+1);
  }
  xy[0]--;
  mg[xy[0]][xy[1]] = '.';
  }
  //2
  if(xy[0] > 0) {
  mg[xy[0]][xy[1]] = '#';
  xy[0]--;
  if(mg[xy[0]][xy[1]] != '#'){
//    cout<<"上"<<endl;
    dfs(mg,n,m,xy,BuShu+1);
  }
  xy[0]++;
  mg[xy[0]][xy[1]] = '.';
  }
  //3
  if(xy[1] < m - 1) {
  mg[xy[0]][xy[1]] = '#';
  xy[1]++;
  if(mg[xy[0]][xy[1]] != '#'){
//    cout<<"右"<<endl;
    dfs(mg,n,m,xy,BuShu+1);
  }
  xy[1]--;
  mg[xy[0]][xy[1]] = '.';
  }
  //4
  if(xy[1] > 0) {
  mg[xy[0]][xy[1]] = '#';
  xy[1]--;
  if(mg[xy[0]][xy[1]] != '#'){
//    cout<<"左"<<endl;
    dfs(mg,n,m,xy,BuShu+1);
  }
  xy[1]++;
  mg[xy[0]][xy[1]] = '.';
  }
}
int main(){
  char mg[100][100] = {};
  int n=0;//迷宫的高(第一维) 
  int m=0;//迷宫的宽(第二维)
  int start[2]={};//起点位置 
  cin>>n>>m;
  //输入迷宫 
  for(int i = 0; i < n; i++){
  for(int j = 0; j < m; j++){
    cin>>mg[i][j];
    if(mg[i][j] == 'S'){
    start[0] = i;
    start[1] = j;
    }
  }
  } 
  //走迷宫——深度搜索
  dfs(mg,n,m,start,0);
//  cout<<"count:"<<count<<endl;
  cout<<count<<endl;
  return 0;
}

4.运行结果

image.png

相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
95 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
156 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
42 0
|
3月前
|
算法 调度
作业调度算法_先来先服务算法_短作业优先算法_高响应比优先算法
本文介绍了作业调度算法,包括先来先服务(FCFS)、短进程优先(SJF)和高响应比优先(HRRN)算法。通过分析进程的到达时间和所需CPU服务时间,计算进程的开始时间、完成时间、平均周转时间和平均带权周转时间,以评估不同算法的性能。FCFS适合长作业,SJF适合短作业,而HRRN则综合了两者的优点。
144 12
|
4月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
2月前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
54 0
|
2月前
|
算法
计科一二班算法数据结构实验9答案
计科一二班算法数据结构实验9答案
21 0
|
4月前
|
DataWorks 算法 调度
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
53 1