最近我上课时遇到这样一个问题:
迈克是一名囚犯,他想从监狱逃跑,为了逃跑做准备他早就暗暗观察了好几周,他知道看守监狱的人们值班的看守据点的位置。于是迈克精心制作了一张n*m的矩阵地图,在矩阵中“M”代表迈克当前所处的位置,“S”表示安全地带。所有“W”位置都表示看守据点,看守据点里有时候会有人看守,其他位置都用“.”号表示,迈克需要从M逃跑到S处,并且肯定希望逃跑时经过的任何一个位置(包括起点和终点)离各个看守据点越远越好,但看守据点里并不是每个时刻都有人,所以有时迈克也是可以偷偷的经过看守据点位置的。我们定义迈克当前的位置i(x1,y1)与某个看守据点j(x2,y2)的距离值d(i,j)=d(i,j)=|x1-x2|+|y1-y2|。迈克每次可以向上下左右四个方向移动,但不能移动到矩阵的外面。
现在请你帮迈克设计一条逃跑路线,使得迈克在在逃跑过程中尽可能离各个看守据点远一点。
输入
输入第1行两个整数n和m,表示矩阵地图。
接下来是一个n*m行的矩阵。
输出
输出一行一个整数,表示迈克在在逃跑过程中尽可能离各个看守据点远的情况下,距离他最近的看守据点的值。
样例1:
输入
4 4
W...
....
....
M..S
输出
3
样例2:
输入
4 5
.....
.WWW.
.W.W.
MW.SW
输出
0
提示:
#样例1
地图上只有一个看守据点,迈克选择一直沿着最下面一行位置向右走到S。
那么迈克经过的位置离看守据点最近的其实就是迈克的起点位置,该起点位置离“W”位置的距离是3。
#样例2
从地图上能看到无论如何走,迈克都必须经过某个看守据点,那么迈克经过的离看守据点最近的位置其实就是某个看守据点的位置,那么距离值就是0
数据范围
1<=n,m<=500。
#include<bits/stdc++.h>
using namespace std;
int n,m,flag[505][505],mhd[505][505],vis[505][505];
struct node{
int x,y,h;
}s,e;
struct w{
int x,y,mhtju;
bool operator <(const w &tmp) const{
return mhtju<tmp.mhtju;
}
};
queue<node> nq;
int dx[4]={0,1,0,-1},dy[4]={-1,0,1,0};
void bfs1(){
while(!nq.empty()){
node cur=nq.front();
nq.pop();
mhd[cur.x][cur.y]=cur.h;
for(int i=0;i<4;i++){
int xx=cur.x+dx[i];
int yy=cur.y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!flag[xx][yy]){
flag[xx][yy]=1;
nq.push((node){xx,yy,cur.h+1});
}
}
}
}
int bfs2(int x,int y){
int ans=1e9;
priority_queue<w> q;
vis[x][y]=1;
q.push((w){x,y,mhd[x][y]});
while(!q.empty()){
w cur=q.top();
q.pop();
if(cur.x==e.x&&cur.y==e.y){
ans=min(ans,cur.mhtju);
}else{
for(int i=0;i<4;i++){
int xx=cur.x+dx[i];
int yy=cur.y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]){
vis[xx][yy]=1;
q.push((w){xx,yy,min(cur.mhtju,mhd[xx][yy])});
}
}
}
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char c;
cin>>c;
if(c=='W'){
flag[i][j]=1;
nq.push((node){i,j});
}else if(c=='M'){
s=(node){i,j};
}else if(c=='S'){
e=(node){i,j};
}
}
}
bfs1();
cout<<bfs2(s.x,s.y);
return 0;
}
//抱歉,代码格式不好,谅解
其中有一段让我甚是懵逼
struct w{
int x,y,mhtju;
bool operator <(const w &tmp) const{
return mhtju<tmp.mhtju;
}
};
这个重定向用来干嘛的??? 还有这个优先队列,我都不知道要怎么用!