ACWing 2060.奶牛选美(DFS,flood fill)

题目链接

https://www.acwing.com/problem/content/2062/

思路

用flood fill算法标记两个斑点的所有位置,枚举这两个斑点求出曼哈顿距离即可。

AC代码

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, m;
char map[51][51];
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
vector<pair<int, int>>v[2];
void dfs(int x, int y, vector<pair<int, int>>&s)
{
	map[x][y] = '.';//走过的标记为.
	s.push_back({ x,y });
	//把点记录下来
	for (int i = 0; i < 4; i++)
	{
		int a = x + dx[i];
		int b = y + dy[i];
		//找下一个点
		if (a >= 0 && a < n && b >= 0 && b < m && map[a][b] == 'X')
		{
			dfs(a, b, s);
		}
	}
}
int main(int argc, char* argv[])
{
	cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> map[i][j];//输入
		}
	}
	int k = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (map[i][j] == 'X')
				dfs(i, j, v[k++]);
			//找到一个X开始遍历,k是斑点的标记。
		}
	}
	int res = 1e8;
	for (auto& a : v[0])
	{
		for (auto& b : v[1])
		{
			res = min(res, abs(a.first - b.first) + abs(a.second - b.second) - 1);
			//求曼哈顿距离为结果
		}
	}
	cout << res;
}

心得

看了视频讲解,因为对flood fill算法并不太熟悉。

posted @ 2022-01-20 21:53  张牧歌  阅读(36)  评论(1编辑  收藏  举报