G — Bucket Brigade
题目大意:
农场失火了,牛都跑去把火扑灭!农场是由一个10×10的网格来描述的,就像这样:
字母“B”代表刚刚着火的谷仓。“L”代表一个湖,“R”代表一块大石头的位置。奶牛们想要组成一个“水桶旅”,把自己安置在湖和谷仓之间的一条小路上,这样它们就可以沿着小路传递一桶桶的水来帮助灭火。如果牛在北、南、东、西四个方向相邻,那么桶可以在它们之间移动。奶牛只有在紧挨着湖的地方才能从湖里汲取一桶水。同样的,奶牛只有在靠近谷仓的地方才能把一桶水泼到谷仓上。请帮忙确定’的最小数量“广场应该被奶牛占领,形成一个成功的旅。奶牛不能在有大石头的广场上,而且谷仓和湖泊也不能紧挨着。
输入
包含10行,每行10个字符,描述了农场的布局。
输出
输出一个整数,给出组成一个可行的斗旅所需的最小奶牛数。
题目分析:
最短路径,经典的广搜题
代码实现:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
int li,lj,bi,bj;
char farm[15][15];
int farm1[15][15] = {0}; //farm[i][j] i和j的距离
int ffxx[4][2] = {{-1,0},{0,-1},{1,0},{0,1}}; //四个方向
queue<int>qx,qy;
void init()
{
for(int i=1; i<=10; i++){
for(int j=1; j<=10; j++){
farm1[i][j] = 99999999;
}
}
}
int bfs()
{
farm1[li][lj] = 0;
while(!qx.empty())
{
int x = qx.front();
int y = qy.front();
qx.pop();
qy.pop();
if(farm[x][y]=='B') break;
for(int i=0; i<4; i++){
int x1 = x+ffxx[i][0];
int y1 = y+ffxx[i][1];
if(1<=x1 && x1<=10 && 1<=y1 && y1<=10 && farm[x1][y1]!='R' && farm1[x1][y1]==99999999){
qx.push(x1);
qy.push(y1);
farm1[x1][y1] = farm1[x][y]+1;
}
}
}
return farm1[bi][bj];
}
int main()
{
init(); //初始化
for(int i=1; i<=10; i++){
for(int j=1; j<=10; j++){
scanf("%c",&farm[i][j]);
if(farm[i][j]=='L'){
li = i;
lj = j;
}
if(farm[i][j]=='B'){
bi = i;
bj = j;
}
}
getchar();
}
qx.push(li);
qy.push(lj);
printf("%d\n",bfs()-1); //广搜
return 0;
}