http://acm.timus.ru/problem.aspx?space=1&num=1643
bfs 就可以 不过要注意细节
思路:
分别求出 ‘!’到每个点的最短路 dist1 ,‘$’到每个点的最短路 dist2 和 ‘*’到每个点的最短路 dist3
然后枚举每个点 的 max(dist1+dist2)+dist3 值 求最小
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<stack>
#include <iomanip>
using namespace std;
#define LL long long
const int INF=0x3f3f3f3f;
const int N=105;
char graph[N][N];
typedef pair<int,int>point;
int X[]={0,0,1,1,1,-1,-1,-1};
int Y[]={-1,1,1,0,-1,-1,0,1};
vector<point>tran[27];
int n,m;
void bfs(int stx,int sty,int dist[N][N])
{
queue<point>qt;
qt.push(point(stx,sty));
dist[stx][sty]=0;
while(!qt.empty())
{
int x=(qt.front()).first;
int y=(qt.front()).second;
qt.pop();
for(int i=0;i<8;++i)
{
int l1=x+X[i];
int l2=y+Y[i];
if(l1>=0&&l1<n&&l2>=0&&l2<m&&graph[l1][l2]!='#'&&graph[l1][l2]!='*'&&dist[l1][l2]==-1)
{
dist[l1][l2]=dist[x][y]+1;
qt.push(point(l1,l2));
if(graph[l1][l2]>='A'&&graph[l1][l2]<='Z')
{
for(unsigned int i=0;i<tran[graph[l1][l2]-'A'].size();++i)
{
int t1=tran[graph[l1][l2]-'A'][i].first;
int t2=tran[graph[l1][l2]-'A'][i].second;;
if(dist[t1][t2]==-1)
{
dist[t1][t2]=dist[l1][l2];
qt.push(point(t1,t2));
}
}
}
}
}
}/*
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
cout<<dist[i][j]<<" ";
cout<<endl;
}cout<<endl;*/
}
int main()
{
//freopen("data.in","r",stdin);
int dist1[N][N];
int dist2[N][N];
int dist3[N][N];
while(cin>>n>>m)
{
getchar();
for(int i=0;i<n;++i)
gets(graph[i]);
memset(dist1,-1,sizeof(dist1));
memset(dist2,-1,sizeof(dist2));
memset(dist3,-1,sizeof(dist3));
for(int i=0;i<27;++i)
tran[i].clear();
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
if(graph[i][j]>='A'&&graph[i][j]<='Z')
{tran[graph[i][j]-'A'].push_back(point(i,j));}
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
{
if(graph[i][j]=='$')
bfs(i,j,dist1);
else if(graph[i][j]=='!')
bfs(i,j,dist2);
else if(graph[i][j]=='*')
bfs(i,j,dist3);
}
int ans=INF;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
{
if(dist1[i][j]>=0&&dist2[i][j]>=0&&dist3[i][j]>=0)
{
ans=min(ans,max(dist1[i][j],dist2[i][j])+dist3[i][j]);
}
}
if(ans==INF)
cout<<"Impossible"<<endl;
else
cout<<ans<<endl;
}
return 0;
}
浙公网安备 33010602011771号