是對最短路徑的變形,即是就最短路徑當中的最長路徑,注意修改即可。bfs,dfs都可以實現,現在附上dfs的實現方式。
#include <iostream>
#include <cstring>
using namespace std;
int const maxn = 100;
char data[maxn][maxn];
int r,c;
int vis[maxn][maxn];
int dr[maxn];
int dc[maxn];
int num;
int ans = -1;
void dfs(int ir,int ic) {
for (int i=0;i<num;i++) {
int nr = ir + dr[i];
int nc = ic + dc[i];
if (nr>=0&&nr<r&&nc>=0&&nc<c) {
if(data[nr][nc]=='.') {
if(vis[nr][nc]==-1) {
vis[nr][nc] = vis[ir][ic] + 1;
dfs(nr,nc);}
else if (vis[nr][nc] > vis[ir][ic] + 1) {
vis[nr][nc] = vis[ir][ic] + 1;
dfs(nr,nc);
}
}
}
}
}
void f() {
for (int i=0;i<r;i++)
for (int j=0;j<c;j++) {
if (data[i][j]!='.') continue;
if (data[i][j]=='.'&&vis[i][j]==-1) {
ans = -1;
return ;
}
if (data[i][j]=='.'&&vis[i][j]>ans) {
ans = vis[i][j];
}
}
}
int main() {
cin>>r>>c;
memset(vis,-1,sizeof(vis));
for (int i=0;i<r;i++)
for (int j=0;j<c;j++) cin>>data[i][j];
int ir,ic;
cin>>ir>>ic;
cin>>num;
for (int i=0;i<num;i++) cin>>dr[i]>>dc[i];
vis[ir][ic]=0;
dfs(ir,ic);
f();
if(ans!=-1) cout<<ans<<endl;
else cout<<-1<<endl;
}