AOJ 0558 题目
老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时。
输入:第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞, 1-N代表硬度为1-N的奶酪的工厂。
这是多次BFS 思路与书中的p34 迷宫的最短路径一样 只不过是多次BFS 多次写循环就好了
代码:#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
#define Max 10000
char field[Max][Max];
const int INF=10000000;
typedef pair<int,int> P;
int N,M,sx,sy,gx,gy,H;
int d[Max][Max];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int goal[Max]{};
int bfs()
{
int anw=0;
deque<P>Q;
for(int c=0;c<H;c++){
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
d[i][j]=INF;
}
}
Q.push_back(P(sx,sy));
d[sx][sy]=0;
while(Q.size()){
int x=Q.front().first;
int y=Q.front().second;
Q.pop_front();
if((int)field[x][y]==49+c){
goal[c]=d[x][y];
sx=x;
sy=y;
break;
}
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(0<=nx&&nx<N&&0<=ny&&ny<M&&field[nx][ny]!='X'&&d[nx][ny]==INF){
Q.push_back(P(nx,ny));
d[nx][ny]=d[x][y]+1;
}
}
}
Q.clear();
anw=anw+goal[c];
}
return anw;
}
int main()
{
cin>>N>>M>>H;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
cin>>field[i][j];
if(field[i][j]=='S'){
sx=i;sy=j;
}
}
}
printf("%d\n",bfs());
return 0;
}