在 H×W 的地图上有 N 个奶酪工厂, 分别生产硬NN 的奶酪。
有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值, 初始时为 11, 每吃一个工厂的奶酪体力值增加 11(每个工厂只能吃一次), 且老鼠只能吃硬度不大于当前体力值的奶酪。
老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间 11 单位, 有障碍物的格不能走。
走到工厂上时即可吃到该工厂的奶酪, 吃奶酪时间不计。问吃遍所有奶酪最少用时。
本题明显需要使用bfs来写,本题的难点就在于搜索的起点和终点是在变换的需要开两个数组来存放起点和重点的位置
代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int vis[N][N];
char mp[N][N];
int sx,sy,gx,gy,ans,n,m,k;
int targetx[N];
int targety[N];
int dir[4][2] = {1,0,-1,0,0,1,0,-1};
struct node{
int x;int y;int step;
}no,b;
queue<node>q;
void bfs(int sx,int sy,int gx,int gy){
while(q.size())q.pop();
memset(vis,0,sizeof(vis));
no.x=sx;no.y=sy;no.step=0;
q.push(no);
while(q.size()){
no=q.front();q.pop();
if(no.x==gx&&no.y==gy){
ans+=no.step;
return ;
}
for(int i=0;i<=3;i++){
int xx=no.x+dir[i][0];
int yy=no.y+dir[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]&&mp[xx][yy]!='X'){
b.x=xx;b.y=yy;b.step=no.step+1;
q.push(b);
vis[xx][yy]=1;
}
}
}
return ;
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
if(mp[i][j]=='S'){
sx=i;sy=j;
gx=i;gy=j;
}
else if(mp[i][j]!='.'&&mp[i][j]!='X'){
int flag=mp[i][j]-'0';
targetx[flag]=i;targety[flag]=j;
}
}
}
for(int i=1;i<=k;i++){
sx=gx;sy=gy;
gx=targetx[i];gy=targety[i];
bfs(sx,sy,gx,gy);
}
cout<<ans<<endl;
return 0;
}