(纪中)2407. Bucket Brigade【BFS】

(File IO): input:buckets.in output:buckets.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet


题目描述
农场上起火了,奶牛们正在紧急赶去灭火!
农场可以用一个像这样的 10 × 10 10×10 的字符方阵来描述:
字符 B 'B' 表示正着火的牛棚。字符 L 'L' 表示一个湖,而字符’ R R' 表示农场上的一块巨大岩石。奶牛们想要沿着一条湖到牛棚之间的路径组成一条“水桶传递队列”,这样她们就可以沿着这条路径传递水桶来帮助灭火。当两头奶牛在东南西北四个方向上相邻时水桶可以在她们之间传递。这对于湖边的奶牛也是对的——奶牛只能在紧挨着湖的时候才能用水桶从湖里取水。类似地,奶牛只能在紧挨着牛棚的时候才能用水去灭牛棚的火。
请帮助求出奶牛们为了组成这样的“水桶传递队列”需要占据的’.'格子的最小数量。奶牛不能站在岩石所在的方格之内,此外保证牛棚和湖不是相邻的。


输入
输入包含 10 10 行,每行 10 10 个字符,描述这个农场的布局。输入保证图案中恰有一个字符 B 'B' 、一个字符 L 'L' 以及一个字符 R 'R'

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


样例输入



…B…

…R…


…L…

样例输出
7


数据范围限制


提示
在这个例子中,以下是其中一个可行的方案,使用了最小数量的奶牛(7):
. . . . . . . . . . ..........
. . . . . . . . . . ..........
. . . . . . . . . . ..........
. . B . . . . . . . ..B.......
. . C . . . . . . . ..C.......
. . C C . R . . . . ..CC.R....
. . . C C C . . . . ...CCC....
. . . . . C . . . . .....C....
. . . . . L . . . . .....L....
. . . . . . . . . . ..........


解题思路
B F S BFS (板子题)暴力


代码

#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;
			   }
			} 
		}
	}
}
发布了119 篇原创文章 · 获赞 8 · 访问量 4898

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/105280940