(File IO): input:buckets.in output:buckets.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
农场上起火了,奶牛们正在紧急赶去灭火!
农场可以用一个像这样的
的字符方阵来描述:
字符
表示正着火的牛棚。字符
表示一个湖,而字符’
表示农场上的一块巨大岩石。奶牛们想要沿着一条湖到牛棚之间的路径组成一条“水桶传递队列”,这样她们就可以沿着这条路径传递水桶来帮助灭火。当两头奶牛在东南西北四个方向上相邻时水桶可以在她们之间传递。这对于湖边的奶牛也是对的——奶牛只能在紧挨着湖的时候才能用水桶从湖里取水。类似地,奶牛只能在紧挨着牛棚的时候才能用水去灭牛棚的火。
请帮助求出奶牛们为了组成这样的“水桶传递队列”需要占据的’.'格子的最小数量。奶牛不能站在岩石所在的方格之内,此外保证牛棚和湖不是相邻的。
输入
输入包含
行,每行
个字符,描述这个农场的布局。输入保证图案中恰有一个字符
、一个字符
以及一个字符
。
输出
输出一个整数,为组成一条可行的水桶传递队列所需要的奶牛的最小数量。
样例输入
…
…
…
…B…
…
…R…
…
…
…L…
…
样例输出
7
数据范围限制
提示
在这个例子中,以下是其中一个可行的方案,使用了最小数量的奶牛(7):
解题思路
(板子题)暴力
代码
#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;
}
}
}
}
}