B-矩阵距离_0x25 搜索-广度优先搜索 (nowcoder.com)
题意解析
这道题让我们求矩阵上的每一个点到达矩阵中值为1的点的最短距离。
实际上就是一个求多源bfs()最短路问题。注意这里与求多源最短路不一样,多源最短路求的是每两个点之间的最短距离。而这里求的是每个点与距离最近的点之间的最短路径。
样例解析
看样例图:
现在我们把每个值为0的点的权值变为它到离他最近的值为1的点的距离:
变为了下面这样:
然后再把所有值为1的点的权值改为0(1到距离最近的1的距离是0):
解题思路
这道题的一个朴素想法就是把所有距离为1的点全部入队,也就是把所有值为1的点全部入队。然后从队头开始向四周搜索,找距离它最近的点,保存一下这个距离,然后出队,下一个元素到队头,继续搜索。
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N = 1010, M = N * N;
typedef pair<int, int>PII;
PII q[M];
char g[N][N];
int dist[N][N];
int n, m;
int dx[] = {-1,0,1,0}, dy[] ={ 0,1,0,-1 };
void bfs()
{
memset(dist,-1,sizeof dist);
int hh = 0, tt = -1;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (g[i][j]=='1')
{
q[++tt] = {i,j}; //把所有的1入队(加入队尾)
dist[i][j] = 0; //1距离最近的1就是自己,距离为0
}
while (hh <= tt)
{
PII t = q[hh++];
//cout << t.x << " " << t.y << endl;
//开始搜索所有的1距离最近的值不为1的点的最短距离
for (int i = 0; i < 4; i++)
{
int tx = t.x + dx[i], ty = t.y + dy[i];
if (tx < 0 || tx >= n || ty < 0 || ty >= m || dist[tx][ty] != -1)continue;
dist[tx][ty] = dist[t.x][t.y] + 1;
q[++tt] = {tx,ty};
}
}
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)cin >> g[i];
bfs();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << dist[i][j] << " ";
}
puts("");
}
return 0;
}