题目描述:
题目描述:在一个二维矩阵中,有两个点的集合,找到最短的距离(从一个集合到另一个集合中)距离的计算方式为(曼哈顿距离)
曼哈顿距离:两点间的曼哈顿距离 = | x1 - x2 | + | y1 - y2 |
输出最短距离
问题难点:
二维矩阵使用了字符类型存储
PII 上下左右的定义
dfs广度优先搜索的模板
floodfill算法的证明使用
Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名。在GNU Go和扫雷中,Flood Fill算法被用来计算需要被清除的区域。
#include<iostream>
#include<bits/stdc++.h>
#include<vector> //数组
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N = 55;//此处定义了数据范围 二维数组的大小
int n,m;
char g[N][N];
vector<PII> points[2];//一共有两个点的集合
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
void bfs(int x,int y,vector<PII>& ps)
{
g[x][y]='.';
ps.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 && g[a][b] == 'X')
{
bfs(a,b,ps);
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>g[i][j];
}
}
for(int i=0 ,k=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(g[i][j]=='X')
{
bfs(i,j,points[k++]);
}
}
}
int res=1e8;//返回的距离长度,先初始化一个很大的距离
for(auto& a:points[0])
{
for(auto& b:points[1])
{
res=min(res,abs(a.x-b.x)+abs(a.y-b.y)-1);
}
}
cout<<res;
return 0;
}