题目描述:
主要思路:
我最不会做的题目就是这种了。
首先一个简单暴力的做法
O
(
n
2
)
O(n^2)
O(n2)
使用flood fill将两个联通块搜索出来,然后暴力的计算每两个点之间的曼哈顿距离,取最小值即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
typedef pair<int,int> pa;
int dis[][2]={1,0,0,1,-1,0,0,-1};
const int N=60;
char a[N][N];
int n,m;
void dfs(int x,int y,vector<pa>& po)
{
a[x][y]='.';
po.push_back({x,y});
for(int i=0;i<4;i++)
{
int dx=x+dis[i][0],dy=dis[i][1]+y;
if(a[dx][dy]=='X')
dfs(dx,dy,po);
}
}
int main()
{
vector<pa> point[5];
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>a[i][j];
getchar();
}
int k=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='X')
dfs(i,j,point[k++]);
}
}
int ans=1e9;
for(auto& a:point[1])
for(auto& b:point[2])
ans=min(ans,abs(a.first-b.first)+abs(a.second-b.second)-1);
cout<<ans<<endl;
return 0;
}
第二个求解这个问题的方法为双端队列
O
(
n
)
O(n)
O(n)
但是还不会……(待补)