农场上起火了,奶牛们正在紧急赶去灭火!
农场可以用一个像这样的 的字符方阵来描述:
..........
..........
..........
..B.......
..........
.....R....
..........
..........
.....L....
..........
字符 表示正着火的牛棚,字符
表示一个湖,而字符
表示农场上的一块巨大岩石。
奶牛们想要沿着一条湖到牛棚之间的路径组成一条“水桶传递队列”,这样她们就可以沿着这条路径传递水桶来帮助灭火。
当两头奶牛在东南西北四个方向上相邻时水桶可以在她们之间传递。
湖边的奶牛也是如此——奶牛只能在紧挨着湖的时候才能用水桶从湖里取水。
类似地,奶牛只能在紧挨着牛棚的时候才能用水去灭牛棚的火。
请帮助求出奶牛们为了组成这样的“水桶传递队列”需要占据的 格子的最小数量。
奶牛不能站在岩石所在的方格之内,此外保证牛棚和湖不是相邻的。
输入格式
输入包含 行,每行
个字符,描述这个农场的布局。
输入保证图案中恰有一个字符 、一个字符
以及一个字符
。
输出格式
输出一个整数,为组成一条可行的水桶传递队列所需要的奶牛的最小数量。
输入样例:
..........
..........
..........
..B.......
..........
.....R....
..........
..........
.....L....
..........
输出样例:
7
样例解释
在这个例子中,以下是一个可行的方案,使用了最小数量的奶牛():
..........
..........
..........
..B.......
..C.......
..CC.R....
...CCC....
.....C....
.....L....
..........
此题除了 暴力做外,也可以根据哈密尔顿距离做(但是要考虑特殊情况:三点在一条直线上,并且 R 在 L 和 B 值之间)
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;
}