思路:LCA求出没有缆车情况下消耗的体力,当有缆车情况下则有如下两种情况
(1)出发点到u,u坐缆车到v,v再到终点
(2)出发点先v,v坐缆车到u, u再到终点
这三种情况取最小即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=35;
int n,m;
int Map[maxn][maxn];
bool vis[maxn][maxn];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
struct Node{
int x;
int y;
int val;
Node(){
}
Node(int a,int b,int c){
x=a;
y=b;
val=c;
}
friend bool operator <(const Node& a,const Node& b){
return a.val>b.val;
}
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
char c;
int x,y;
int ex,ey;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c;
if(c=='S'){
Map[i][j]=0;
x=i;
y=j;
}
else if(c=='A'||c=='B'||c=='C') Map[i][j]=100;
else if(c=='E'){
ex=i;
ey=j;
}
else Map[i][j]=c-'0';
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<Map[i][j]<<" ";
}
cout<<endl;
}
priority_queue<Node> p;
p.push(Node(x,y,0));
while(p.size()){
Node temp=p.top();
p.pop();
//cout<<temp.x<<" "<<temp.y<<" "<<temp.val<<endl;
if(temp.x==ex&&temp.y==ey){
cout<<temp.val<<endl;
return 0;
}
if(vis[temp.x][temp.y]) continue;
vis[temp.x][temp.y]=1;
for(int i=0;i<4;i++){
int ix=temp.x+dx[i];
int iy=temp.y+dy[i];
if(ix>=1&&ix<=n&&iy>=1&&iy<=m&&!vis[ix][iy]){
p.push(Node(ix,iy,temp.val+Map[ix][iy]));
}
}
}
return 0;
}