0
点赞
收藏
分享

微信扫一扫

水桶传递队列(春季每日一题 12)

农场上起火了,奶牛们正在紧急赶去灭火!

农场可以用一个像这样的 水桶传递队列(春季每日一题 12)_分类讨论 的字符方阵来描述:

..........
..........
..........
..B.......
..........
.....R....
..........
..........
.....L....
..........

字符 水桶传递队列(春季每日一题 12)_分类讨论_02 表示正着火的牛棚,字符 水桶传递队列(春季每日一题 12)_bfs_03 表示一个湖,而字符 水桶传递队列(春季每日一题 12)_i++_04 表示农场上的一块巨大岩石。

奶牛们想要沿着一条湖到牛棚之间的路径组成一条“水桶传递队列”,这样她们就可以沿着这条路径传递水桶来帮助灭火。

当两头奶牛在东南西北四个方向上相邻时水桶可以在她们之间传递。

湖边的奶牛也是如此——奶牛只能在紧挨着湖的时候才能用水桶从湖里取水。

类似地,奶牛只能在紧挨着牛棚的时候才能用水去灭牛棚的火。

请帮助求出奶牛们为了组成这样的“水桶传递队列”需要占据的 水桶传递队列(春季每日一题 12)_#define_05 格子的最小数量。

奶牛不能站在岩石所在的方格之内,此外保证牛棚和湖不是相邻的。

输入格式
输入包含 水桶传递队列(春季每日一题 12)_ios_06 行,每行 水桶传递队列(春季每日一题 12)_ios_06 个字符,描述这个农场的布局。

输入保证图案中恰有一个字符 水桶传递队列(春季每日一题 12)_分类讨论_02、一个字符 水桶传递队列(春季每日一题 12)_bfs_03 以及一个字符 水桶传递队列(春季每日一题 12)_i++_04

输出格式
输出一个整数,为组成一条可行的水桶传递队列所需要的奶牛的最小数量。

输入样例:

..........
..........
..........
..B.......
..........
.....R....
..........
..........
.....L....
..........

输出样例:

7

样例解释
在这个例子中,以下是一个可行的方案,使用了最小数量的奶牛(水桶传递队列(春季每日一题 12)_ios_11):

..........
..........
..........
..B.......
..C.......
..CC.R....
...CCC....
.....C....
.....L....
..........

此题除了 水桶传递队列(春季每日一题 12)_bfs_12 暴力做外,也可以根据哈密尔顿距离做(但是要考虑特殊情况:三点在一条直线上,并且 R 在 L 和 B 值之间)

#include<iostream>

#define x first
#define y second

using namespace std;

const int N = 15;

typedef pair<int, int> PII;

char s[N][N];
int st[N][N];
PII q[N*N];

int main(){

for(int i = 0; i < 10; i++) cin >> s[i];

int a, b;
for(int i = 0; i < 10; i++)
for(int j = 0; j < 10; j++)
if(s[i][j] == 'B')
a = i, b = j;

st[a][b] = 1;

int hh = 0, tt = -1;
q[++tt] = {a, b};

int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};


while(hh <= tt){

auto t = q[hh++];
int x = t.x, y = t.y;
for(int i = 0; i < 4; i++){

int a = dx[i] + x, b = y + dy[i];
if(a < 0 || a >= 10 || b < 0 || b >= 10) continue;
if(st[a][b] || s[a][b] == 'R') continue;

if(s[a][b] == '.') st[a][b] = st[x][y] + 1;
if(s[a][b] == 'L') {

cout << st[x][y] - 1 << endl;
return 0;
}
q[++tt] = {a, b};
}

}

return 0;
}


举报

相关推荐

0 条评论