2020 GDUT Rating Contest Ⅱ G. Bucket Brigade

G. Bucket Brigade

链接

题目描述
给一个10*10的图,由’B’、‘R’、‘L’、’.‘构成,分别代指着火的谷仓、石头(无法经过)、湖、与路。现在让牛用肉身从谷仓(B)旁边搭桥到湖(L)旁边(上下左右方向的接触才算),每个牛占一个’.’,求最少需要几头牛。

题目分析
标准的bfs题,求最短距离,用队列进行bfs即可。

代码

#include <bits/stdc++.h>
 
using namespace std;
 
char farm[10][11];
bool visit[10][10];
int dis[10][10];

 //方向向量
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
 
struct point{
	int x;
	int y;
};
 
point lake,barn;
 
int main(){
	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++){
			farm[i][j]=getchar();
			if(farm[i][j]=='B')
				barn.x=i,barn.y=j;
			else if(farm[i][j]=='L')
				lake.x=i,lake.y=j;
		}
		getchar();
	}
	//printf("%d %d\n",barn.x,barn.y);
	//printf("%d %d\n",lake.x,lake.y);
	int ans=0;
	queue <point> que;
	que.push(lake);
	visit[lake.x][lake.y]=1;
	while(!que.empty()){
		point t=que.front();
		que.pop();
		for(int i=0;i<4;i++){
			int tx=t.x+dx[i],ty=t.y+dy[i];
			if(visit[tx][ty]||farm[tx][ty]=='R'||tx>9||ty>9||tx<0||ty<0)
				continue;
			else if(tx==barn.x&&ty==barn.y){
				printf("%d\n",dis[t.x][t.y]);
				return 0;
			}
			else{
				visit[tx][ty]=1;
				dis[tx][ty]=dis[t.x][t.y]+1;
				point makepoint={tx,ty};
				//printf("tx=%d,ty=%d,dis[tx][ty]=%d\n",tx,ty,dis[tx][ty]);
				que.push(makepoint);
			}
		}
	}
}
发布了24 篇原创文章 · 获赞 1 · 访问量 661

猜你喜欢

转载自blog.csdn.net/palax0/article/details/104819736
今日推荐