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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值