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

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

第一题:神奇宝贝大军


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

相关文章
|
10月前
|
机器学习/深度学习 算法 Java
基于灰狼优化算法(GWO)解决柔性作业车间调度问题(Matlab代码实现)
基于灰狼优化算法(GWO)解决柔性作业车间调度问题(Matlab代码实现)
456 1
|
10月前
|
供应链 算法 Java
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
415 1
|
10月前
|
供应链 算法 调度
基于非支配吸血水蛭优化算法 (NSBSLO)求解多目标柔性作业车间调度问题(FJSP)研究(Matlab代码实现)
基于非支配吸血水蛭优化算法 (NSBSLO)求解多目标柔性作业车间调度问题(FJSP)研究(Matlab代码实现)
242 8
|
10月前
|
机器学习/深度学习 负载均衡 算法
【柔性作业车间调度】基于四种多目标优化算法(NSOOA、NSPSO、NSDBO、NSCOA)求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
【柔性作业车间调度】基于四种多目标优化算法(NSOOA、NSPSO、NSDBO、NSCOA)求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
602 0
|
算法 数据可视化 Python
Python中利用遗传算法探索迷宫出路
本文探讨了如何利用Python和遗传算法解决迷宫问题。迷宫建模通过二维数组实现,0表示通路,1为墙壁,&#39;S&#39;和&#39;E&#39;分别代表起点与终点。遗传算法的核心包括个体编码(路径方向序列)、适应度函数(评估路径有效性)、选择、交叉和变异操作。通过迭代优化,算法逐步生成更优路径,最终找到从起点到终点的最佳解决方案。文末还展示了结果可视化方法及遗传算法的应用前景。
336 5
|
机器学习/深度学习 算法 数据可视化
基于Qlearning强化学习的机器人迷宫路线搜索算法matlab仿真
本内容展示了基于Q-learning算法的机器人迷宫路径搜索仿真及其实现过程。通过Matlab2022a进行仿真,结果以图形形式呈现,无水印(附图1-4)。算法理论部分介绍了Q-learning的核心概念,包括智能体、环境、状态、动作和奖励,以及Q表的构建与更新方法。具体实现中,将迷宫抽象为二维网格世界,定义起点和终点,利用Q-learning训练机器人找到最优路径。核心程序代码实现了多轮训练、累计奖励值与Q值的可视化,并展示了机器人从起点到终点的路径规划过程。
706 0
|
算法 数据可视化 调度
基于NSGAII的的柔性作业调度优化算法MATLAB仿真,仿真输出甘特图
本程序基于NSGA-II算法实现柔性作业调度优化,适用于多目标优化场景(如最小化完工时间、延期、机器负载及能耗)。核心代码完成任务分配与甘特图绘制,支持MATLAB 2022A运行。算法通过初始化种群、遗传操作和选择策略迭代优化调度方案,最终输出包含完工时间、延期、机器负载和能耗等关键指标的可视化结果,为制造业生产计划提供科学依据。
|
存储 算法 测试技术
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
|
算法 编译器 C++
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
|
存储 人工智能 算法
【深度优先搜索篇】走迷宫的魔法:算法如何破解迷宫的神秘密码
【深度优先搜索篇】走迷宫的魔法:算法如何破解迷宫的神秘密码

热门文章

最新文章