解析
此题就是bfs的简单应用,N块奶酪相当于N个终点,所以遍历进行N次bfs,再把结果累加起来就好了。
#include <bits/stdc++.h>
using namespace std;
int H,W,N;
char Map[1010][1010];
int Si[10];
int Sj[10];
int ans=0;
typedef pair<int,int> P;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int dis[1010][1010];
int bfs(int i)
{
memset(dis,-1,sizeof(dis));
P S=make_pair(Si[i],Sj[i]);
P E=make_pair(Si[i+1],Sj[i+1]);
dis[Si[i]][Sj[i]] = 0;
queue<P> q;
q.push(S);
while(q.size())
{
P next=q.front();
q.pop();
if(next.first==Si[i+1]&&next.second==Sj[i+1])
break;
for(int i=0;i<4;i++)
{
int nx=next.first+dx[i];
int ny=next.second+dy[i];
if(dis[nx][ny]<0&&nx>=1&&nx<=H&&ny>=1&&ny<=W&&Map[nx][ny]=='.')
{
q.push(P(nx,ny));
dis[nx][ny]=dis[next.first][next.second]+1;
}
}
}
return dis[E.first][E.second];
}
int main()
{
//需要注意输入的时候 防止回车符读入数据中
//还需要将'S'和奶酪工厂处的值置为'.'
scanf("%d%d%d",&H,&W,&N);
getchar();
for(int i=1;i<=H;i++)
{
for(int j=1;j<=W;j++)
{
scanf("%c",&Map[i][j]);
if(Map[i][j]=='S')
{
Si[0]=i;
Sj[0]=j;
Map[i][j]='.';
}
else if(isdigit(Map[i][j]))
{
Si[Map[i][j]-48]=i;
Sj[Map[i][j]-48]=j;
Map[i][j]='.';
}
}
getchar();
}
for(int i=0;i<N;i++)
{
//cout<<i<<": "<<bfs(i)<<endl;
ans+=bfs(i);
}
printf("%d\n",ans);
return 0;
}