//题目大意:我移动一次,其他人移动一次(上下左右或不动),
//处在同一个格子时会进行战斗, 输出最少需要进行的战斗场次
//贪心思想:找出我的最短路径,比较其他人到终点的最短路径和我的最短路径,
//如果比我的短,说明他一定能提前在终点等我,也就是说一定会遇到
//找出最短路径用 bfs 算法
#include <bits/stdc++.h>
using namespace std;
typedef pair<int ,int> PII;
const int N=1010;
int n,m;
char g[N][N];
int dx[4]={-1,0,1,0} , dy[4]={0,1,0,-1};
int dist[N][N];
int bfs(){
memset(dist , 0x3f , sizeof dist);
int sx,sy;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(g[i][j]=='E') sx =i , sy = j;
queue <PII> q;
q.push({sx,sy});
dist[sx][sy] = 0;
while(q.size()){
auto t = q.front();
q.pop();
for (int i=0;i<4;i++){
int x=t.x+dx[i], y=t.y+dy[i];
if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]!='T'){
if(dist[i][j]>dist[t.x][t.y]+1){
dist[x][y]=dist[t.x][t.y]+1;
q.push({x,y});
}
}
}
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(g[i][j]=='S') return dist[i][j];
return -1;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>g[i];
int t=bfs();
int ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(g[i][j]>'0'&&g[i][j]<='9'&&dist[i][j]<=t) ans+=g[i][j]-'0';
cout<<ans<<endl;
return 0;
}
逃离大森林 (BFS+贪心)
最新推荐文章于 2024-07-25 11:27:31 发布