2020.2.22GDUT寒假训练排位赛2-G

G — Bucket Brigade

题目大意:

农场失火了,牛都跑去把火扑灭!农场是由一个10×10的网格来描述的,就像这样:
2020.2.22GDUT寒假训练排位赛2-G_第1张图片
字母“B”代表刚刚着火的谷仓。“L”代表一个湖,“R”代表一块大石头的位置。奶牛们想要组成一个“水桶旅”,把自己安置在湖和谷仓之间的一条小路上,这样它们就可以沿着小路传递一桶桶的水来帮助灭火。如果牛在北、南、东、西四个方向相邻,那么桶可以在它们之间移动。奶牛只有在紧挨着湖的地方才能从湖里汲取一桶水。同样的,奶牛只有在靠近谷仓的地方才能把一桶水泼到谷仓上。请帮忙确定’的最小数量“广场应该被奶牛占领,形成一个成功的旅。奶牛不能在有大石头的广场上,而且谷仓和湖泊也不能紧挨着。
输入
包含10行,每行10个字符,描述了农场的布局。
输出
输出一个整数,给出组成一个可行的斗旅所需的最小奶牛数。
2020.2.22GDUT寒假训练排位赛2-G_第2张图片

题目分析:

最短路径,经典的广搜题

代码实现:

#include 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(2020.2.22GDUT寒假训练排位赛2-G)