#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{
int R,C;
while(cin>>R>>C){
queue<pair<int,int> > bfs;
map<pair<int,int>,int> index;//每个.作为出口的最短距离
map<pair<int,int>,int>::iterator indexIter;
int startX,startY,k;//k表示合法操作数
char **ground=new char *[R];//存放迷宫
for (int i=0;i<R;i++){
ground[i]=new char [C];
}
for (int i=0;i<R;i++){
for (int j=0;j<C;j++){
cin>>ground[i][j];
if (ground[i][j]=='.') index[make_pair(i,j)]=-1;
}
}
cin>>startX>>startY;
bfs.push(make_pair(startX,startY));
index[make_pair(startX,startY)]=0;
cin>>k;
vector<pair<int,int> > step(k,make_pair(0,0));
for (int i=0;i<k;i++){
int x,y;
cin>>x>>y;
step[i]=make_pair(x,y);
}
//bfs
while(!bfs.empty()){
pair<int,int> coordinate=bfs.front();
bfs.pop();
int x=coordinate.first,y=coordinate.second;
for (int i=0;i<k;i++){
int xx=x+step[i].first,yy=y+step[i].second;
if (xx>=0 && xx<R && yy>=0 && yy<C && ground[xx][yy]=='.'){
if (index[make_pair(xx,yy)]==-1||index[make_pair(xx,yy)]>=index[coordinate]+1){//选择最短路径
index[make_pair(xx,yy)]=index[coordinate]+1;
bfs.push(make_pair(xx,yy));
}
}
}
}
int maxvalue=INT_MIN;
for (indexIter=index.begin();indexIter!=index.end();indexIter++){
if (indexIter->second==-1){
maxvalue=-1;
break;
}
maxvalue=maxvalue<indexIter->second?indexIter->second:maxvalue;//最短路径中最长的距离
}
cout<<maxvalue<<endl;
delete [] ground;
}
return 0;
}
地牢逃脱
最新推荐文章于 2024-05-03 11:45:27 发布