#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int N = 1e3 + 10;
int n, m;
char g[N][N];
int dist[N][N];
int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
void bfs()
{
queue<pair<int, int>> q;
memset(dist, -1, sizeof dist);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (g[i][j] == '1') {
q.push({i, j});
dist[i][j] = 0;
}
}
}
while (q.size()) {
auto t = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int x = t.first + dx[i], y = t.second + dy[i];
if (x < 0 || x >= n || y < 0 || y >= m) {
continue;
}
if (dist[x][y] == -1) {
dist[x][y] = dist[t.first][t.second] + 1;
q.push({x, y});
}
}
}
}
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++) {
if (j > 0) {
cout << " ";
}
cout << dist[i][j];
}
cout << endl;
}
return 0;
}
几乎和大佬的代码一模一样,但为什么我的出现了段错误:
我好像明白了,把[x, y]前的&去掉就行了,但不知道原理是什么
由于 C++ STL 的 queue 的 push 和 pop 操作会改变容器内部的数据结构,因此在使用引用的方式访问
pair<int, int>
元素时,如果该元素已经被 pop 掉,则会访问到已经被释放的内存,从而导致段错误。因此在访问 queue 中的元素时,不建议使用引用的方式。有没有大佬说一下为什么二维矩阵用一重循环就初始化了
是当成字符串输入那里么
scanf(“%1d”,&a[i][j]);同样的效果
蟹bro
nice
请教一下那个等于负一是什么意思
还没有到过
先把所有1位置找到,放入队列搜索,这样搜索一次就可以得到最小距离了。每一个1的搜索都是最小距离。
数组模拟队列会超时 or2
没有,还比这个要快一点
可能是队列数组范围开太大了
几乎和大佬的代码一模一样,但为什么WA了:
太清晰了%%%
666666666666
太棒了dalao,一下就明白了!!%%%%%%
妙蛙
orz
这个输入方式cin>>g[i] tql
写的真好
Orz,懂了
Orz
写的真的很详细 ORZ
写的真好。一下就看懂了
终于看到一个说人话的题解,谢谢你
dl写的很好呀,不禁留下赞和评论~~