题目链接
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算法并不太熟悉。