(File IO): input:buckets.in output:buckets.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
农场上起火了,奶牛们正在紧急赶去灭火!
农场可以用一个像这样的10×1010×1010×10的字符方阵来描述:
字符′B′'B'′B′表示正着火的牛棚。字符′L′'L'′L′表示一个湖,而字符’R′R'R′表示农场上的一块巨大岩石。奶牛们想要沿着一条湖到牛棚之间的路径组成一条“水桶传递队列”,这样她们就可以沿着这条路径传递水桶来帮助灭火。当两头奶牛在东南西北四个方向上相邻时水桶可以在她们之间传递。这对于湖边的奶牛也是对的——奶牛只能在紧挨着湖的时候才能用水桶从湖里取水。类似地,奶牛只能在紧挨着牛棚的时候才能用水去灭牛棚的火。
请帮助求出奶牛们为了组成这样的“水桶传递队列”需要占据的’.'格子的最小数量。奶牛不能站在岩石所在的方格之内,此外保证牛棚和湖不是相邻的。
输入
输入包含101010行,每行101010个字符,描述这个农场的布局。输入保证图案中恰有一个字符′B′'B'′B′、一个字符′L′'L'′L′以及一个字符′R′'R'′R′。
输出
输出一个整数,为组成一条可行的水桶传递队列所需要的奶牛的最小数量。
样例输入
…
…
…
…B…
…
…R…
…
…
…L…
…
样例输出
7
数据范围限制
提示
在这个例子中,以下是其中一个可行的方案,使用了最小数量的奶牛(7):
..............................
..............................
..............................
..B.........B.........B.......
..C.........C.........C.......
..CC.R......CC.R......CC.R....
...CCC.......CCC.......CCC....
.....C.........C.........C....
.....L.........L.........L....
..............................
解题思路
BFSBFSBFS(板子题)暴力
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
const int dx[5]={0,1,-1,0,0};
const int dy[5]={0,0,0,1,-1};
char a[15][15];
int f[15][15],v[15][15],st[110][3],h,t,a1,b,c,d;
bool check(int x,int y)
{
if(x>0&&x<=10&&y>0&&y<=10&&!v[x][y]&&f[x][y]!=1)
return 1;
else
return 0;
}
int main(){
freopen("buckets.in","r",stdin);
freopen("buckets.out","w",stdout);
for(int i=1;i<=10;i++)
{
for(int j=1;j<=10;j++)
{
cin>>a[i][j];
if(a[i][j]=='.') f[i][j]=0;
if(a[i][j]=='R') f[i][j]=1;
if(a[i][j]=='L') a1=i,b=j;
if(a[i][j]=='B')
f[i][j]=2,c=i,d=j;
}
}
h=0,t=1;
st[1][1]=a1;
st[1][2]=b;
st[1][3]=0;
while(h<t){
h++;
for(int k=1;k<=4;k++)
{
if(check(st[h][1]+dx[k],st[h][2]+dy[k])){
t++;
st[t][1]=st[h][1]+dx[k];
st[t][2]=st[h][2]+dy[k];
st[t][3]=st[h][3]+1;
v[st[t][1]][st[t][2]]=1;
if(st[t][1]==c&&st[t][2]==d)
{
cout<<st[t][3]-1;
h=85200;
t=0;
break;
}
}
}
}
}
面对农场火灾,奶牛们需组成水桶传递队列灭火。挑战在于寻找从湖到着火牛棚路径上所需最少奶牛数量,利用BFS算法解决这一问题。
844

被折叠的 条评论
为什么被折叠?



