タイトルの説明
農場で火事があり、牛は火を消すために急いでいた!
ファームは、次のような10×10文字の正方行列で表すことができます。
文字「B」は、発砲しているブルペンを表します。文字「L」は湖を表し、文字「R」は農場の巨大な岩を表します。牛は、湖から牛舎までの経路に沿って「バケットデリバリーキュー」を形成し、この経路に沿ってバケットを通過させて消火できるようにしたいと考えています。2頭の牛が南東、北西の4方向に隣接している場合、バケツはそれらの間を通過できます。これは、湖のそばにいる牛にも当てはまります。同様に、牛は牛舎に隣接している場合にのみ、牛舎の火を消すために水を使用できます。
このような「バケットデリバリーキュー」を形成するために牛が占有する必要のある「。」グリッドの最小数を見つけてください。乳牛は、岩のある広場の中に立つことはできません。また、牛舎と湖が隣接していないことを確認してください。
入力
入力には、ファームのレイアウトを説明する、それぞれ10文字の10行が含まれています。入力は、パターン内に正確に1つの文字「B」、1つの文字「L」、および1つの文字「R」があることを保証します。
アウトプット
整数を出力します。これは、実現可能なバケット配信キューを形成するために必要な牛の最小数です。
入力例
..........
..........
..........
..B.......
..........
.....R....
..........
..........
.....L....
..........
出力例
7
分析
この質問は少し水っぽいです...実際、最短経路を直接検索します。
もちろん、数学的方法もあります( 'R'が1つしかないため)。行と列を追加するだけです。
ディープサーチを使用しています。
コードオン
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int dx[5]={0,1,0,-1,0};
const int dy[5]={0,0,1,0,-1};
char a[20][20];
int sx,sy,ex,ey,ans=0x3fffff;
void dfs(int x,int y,int k)
{
if(k<ans)
{
for(int i=1;i<=4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>0&&xx<=10&&yy>0&&yy<=10&&a[xx][yy]=='.')
{
a[xx][yy]='R';
if(xx==ex&&yy==ey)
{
ans=k;
}
else dfs(xx,yy,k+1);
a[xx][yy]='.';
}
}
}
}
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]=='L')
{
sx=i;
sy=j;
}
else if(a[i][j]=='B')
{
ex=i;
ey=j;
a[i][j]='.';//变一下,不然到不了
}
}
}
dfs(sx,sy,0);
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}