2020.2.22GDUT寒假训练排位赛2-G

G — Bucket Brigade 题目大意: 农场失火了,牛都跑去把火扑灭!农场是由一个10×10的网格来描述的,就像这样:
2020.2.22GDUT寒假训练排位赛2-G
文章图片

字母“B”代表刚刚着火的谷仓。“L”代表一个湖,“R”代表一块大石头的位置。奶牛们想要组成一个“水桶旅”,把自己安置在湖和谷仓之间的一条小路上,这样它们就可以沿着小路传递一桶桶的水来帮助灭火。如果牛在北、南、东、西四个方向相邻,那么桶可以在它们之间移动。奶牛只有在紧挨着湖的地方才能从湖里汲取一桶水。同样的,奶牛只有在靠近谷仓的地方才能把一桶水泼到谷仓上。请帮忙确定’的最小数量“广场应该被奶牛占领,形成一个成功的旅。奶牛不能在有大石头的广场上,而且谷仓和湖泊也不能紧挨着。
输入
包含10行,每行10个字符,描述了农场的布局。
输出
输出一个整数,给出组成一个可行的斗旅所需的最小奶牛数。
2020.2.22GDUT寒假训练排位赛2-G
文章图片

题目分析: 【2020.2.22GDUT寒假训练排位赛2-G】最短路径,经典的广搜题
代码实现:

#include #include #include #include using namespace std; int li,lj,bi,bj; char farm[15][15]; int farm1[15][15] = {0}; //farm[i][j] i和j的距离 int ffxx[4][2] = {{-1,0},{0,-1},{1,0},{0,1}}; //四个方向 queueqx,qy; void init() { for(int i=1; i<=10; i++){ for(int j=1; j<=10; j++){ farm1[i][j] = 99999999; } } } int bfs() { farm1[li][lj] = 0; while(!qx.empty()) { int x = qx.front(); int y = qy.front(); qx.pop(); qy.pop(); if(farm[x][y]=='B') break; for(int i=0; i<4; i++){ int x1 = x+ffxx[i][0]; int y1 = y+ffxx[i][1]; if(1<=x1 && x1<=10 && 1<=y1 && y1<=10 && farm[x1][y1]!='R' && farm1[x1][y1]==99999999){ qx.push(x1); qy.push(y1); farm1[x1][y1] = farm1[x][y]+1; } } } return farm1[bi][bj]; }int main() { init(); //初始化 for(int i=1; i<=10; i++){ for(int j=1; j<=10; j++){ scanf("%c",&farm[i][j]); if(farm[i][j]=='L'){ li = i; lj = j; } if(farm[i][j]=='B'){ bi = i; bj = j; } } getchar(); } qx.push(li); qy.push(lj); printf("%d\n",bfs()-1); //广搜return 0; }

    推荐阅读