逃生(c++)

迷宫被分成N行M列的格子。从上往下看,行的编号是1至N。从左往右看,列的编号是1至M。你现在位于第1行第1列格子,迷宫的出口在第N行第M列的格子。每进入一个格子都要消耗能量。迷宫格子的能量有点奇特,同一行格子消耗的能量是相等的,第1行的每一个格子消耗的能量都是E[1],第2行的每一个格子消耗的能量都是E[2],....第N行的每一个格子消耗的能量都是E[N]。现在你要从左上角格子走到右下角格子,每一步可以从当前格子走到相邻的上、下、左、右四个格子之一,你的目标是消耗最小的总能量。注意:左上角格子和右下角格子消耗的能量也要算。

输入格式

第一行,M和N。

接下来有N个数,第i个是E[i]。

输出格式

一个整数。

输入/输出例子1

输入:

5  6

3  2  5 4  2  8

输出:

32

样例解释

2.jpg

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
int main(){
	ll m,n,a,s=0,min=99999999;
	cin>>m>>n;
	for(int i=1;i<=n;i++){
		cin>>a;
		s+=a;
		if(min>a) min=a;
	}
	cout<<s-min+min*m;
	return 0;
}

 

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一 。课程设计题目:漫步迷宫 二 。问题描述: 用mn的m*n个正方格表示一个迷宫,其中划有斜线的方格表示不可通,未划有斜线的方格表示可以通。请编写寻找从入口到出口的一条最短路径的程序。 三 。基本要求: 1。迷宫的规格(即数与数),状态设置(即各方格能否通的状态),以及入口和出口的位置,均应由输入随机确定。 2。求得的最短路径,应该以从入口到出口的路径上的各个方格的坐标的线性序输出。当无通路时,应该报告无路径的信息。 3。尽量采用结构化程序设计方法,要求对各个模块的功能及参数作必要的说明。 四 。实现提示: 1。迷宫可以采用matrix类型的二维数组A表示。A.rownum与A.colnum分别表示迷宫的实际的数与数。而A.maze[i][j]表示迷宫中第i第j的一个方格,用A.maze[i][j]=0表示该方格可以通,用A.maze[i][j]=1表示该方格不可以通。 2。由于要寻找从入口到出口的一条最短路径,最好将迷宫看作是一个图结构。则问题转化为寻找从对应于入口顶点到对应于出口顶点的一条最短路径的问题。该问题可以采用从入口顶点出发,进广度优先搜索遍历,直到遇到出口顶点或者遍历完毕也没有遇到出口顶点为止。这二种情况分别对应于最短路径探索成功与查无通路的事实。 3。基于上述分析,涉及到数据结构的转换,即将二维数组表示的迷宫A转换为以adjlist 类型的邻接表表示的图结构G。在图结构中,将迷宫中的每个方格看作是一个顶点。不可通的方格都是孤立顶点;相邻的可通的方格所对应的顶点之间看作是有边相连。因此迷宫 可以看作是由m*n个顶点及无向边构成的一个非连通的无向图。尽管图是不连通的,但不影响本问题的求解,而且本问题有解的条件是:入口顶点与出口顶点在同一个连通分量中。 图结构G中,G.adj[k]表示编号为k的顶点的邻接情况的单链表的头指针;G.vexnum表示图G中的实际顶点数,而且具有如下关系:G.vexnum=A.rownum*A.colnum 4。为了避免迷宫数据的重复输入,我们期望A能够自动地转换为G。因此应该设计一个转换算法create_adjlist(A,G)。而图结构中顶点是要编号的,我们约定以为序,顺序给迷宫A中的方格所对应的顶点编号。这样迷宫中方格的坐标(即row和col)与图G中所对应的顶点的编号(即verno)之间具有如下关系: verno=(row-1)* n + col row=(verno-1)/ n + 1 col=(verno-1)% n + 1 5。在广度优先搜索遍历求解最短路径过程中,应该设置一个队queue作为辅助数据结构;路径采用一个整数数组pred来表示。这二个数据结构的存储结构类型均为list类型,其说明定义如下:typedef int list[MAXVER]; 队queue应该设置front和rear分别指示首与尾,queue[k]表示第k个入的顶点编号。采用pred记录路径,pred[i]表示顶点i在广度优先搜索遍历过程中的前趋顶点的编号,它表明是经过边(pred[i],i)达到顶点i的。这样,当路径探索成功时,我们可以从出口顶点倒推出从入口到出口的一条路径来。当然要涉及到从顶点编号向方格坐标的反转换,这个公式在上面已经给出了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值