G. Bucket Brigade
题目描述
给一个10*10的图,由’B’、‘R’、‘L’、’.‘构成,分别代指着火的谷仓、石头(无法经过)、湖、与路。现在让牛用肉身从谷仓(B)旁边搭桥到湖(L)旁边(上下左右方向的接触才算),每个牛占一个’.’,求最少需要几头牛。
题目分析
标准的bfs题,求最短距离,用队列进行bfs即可。
代码
#include <bits/stdc++.h>
using namespace std;
char farm[10][11];
bool visit[10][10];
int dis[10][10];
//方向向量
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
struct point{
int x;
int y;
};
point lake,barn;
int main(){
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
farm[i][j]=getchar();
if(farm[i][j]=='B')
barn.x=i,barn.y=j;
else if(farm[i][j]=='L')
lake.x=i,lake.y=j;
}
getchar();
}
//printf("%d %d\n",barn.x,barn.y);
//printf("%d %d\n",lake.x,lake.y);
int ans=0;
queue <point> que;
que.push(lake);
visit[lake.x][lake.y]=1;
while(!que.empty()){
point t=que.front();
que.pop();
for(int i=0;i<4;i++){
int tx=t.x+dx[i],ty=t.y+dy[i];
if(visit[tx][ty]||farm[tx][ty]=='R'||tx>9||ty>9||tx<0||ty<0)
continue;
else if(tx==barn.x&&ty==barn.y){
printf("%d\n",dis[t.x][t.y]);
return 0;
}
else{
visit[tx][ty]=1;
dis[tx][ty]=dis[t.x][t.y]+1;
point makepoint={tx,ty};
//printf("tx=%d,ty=%d,dis[tx][ty]=%d\n",tx,ty,dis[tx][ty]);
que.push(makepoint);
}
}
}
}