BFS复习 多次BFS

AOJ 0558  题目

题目大意(摘自网络): 在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪。有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。 
老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时。 
输入:第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞, 1-N代表硬度为1-N的奶酪的工厂。
摘自:https://www.cnblogs.com/carolunar/p/6353956.html

这是多次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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值