问题描述 :
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:
0 0 0
0 1 0
0 0 0
输出:
0 0 0
0 1 0
0 0 0
示例 2:
输入:
0 0 0
0 1 0
1 1 1
输出:
0 0 0
0 1 0
1 2 1
注意:
给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。
可使用以下main函数:
int main(){
vector<vector<int> > matrix;
int m,n;
cin>>m;
cin>>n;
char ch;
for(int i=0; i<m; i++){
vector<int> aLine;
for(int j=0; j<n; j++){
cin>>ch;
aLine.push_back(ch-'0');
}
matrix.push_back(aLine);
}
vector<vector<int>> res=updateMatrix(matrix);
for(int i=0; i<res.size(); i++){
vector<int> aLine = res[i];
for(int j=0; j<aLine.size(); j++)
cout<<aLine[j];
cout<<endl;
}
return 0;
}
输入说明 :
首先输入矩阵的行数m和列数n,m*n<=10000
然后输入m行,每行n个字符0或1。中间无空格分隔。
输出说明 :
输出结果,0、1之间无空格。
输入范例 :
3 3
000
010
111
输出范例 :
000
010
121
vector<vector<int>> dirs={{-1,0},{1,0},{0,1},{0,-1}};
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<vector<int>> dist(m, vector<int>(n,0));
vector<vector<int>> seen(m, vector<int>(n,0));//标记已经搜索过的点
queue<pair<int, int>> q;
// 将所有的 0 添加进初始队列中
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (matrix[i][j] == 0) {
q.emplace(i, j);
seen[i][j] = 1;
}
}
}
// 广度优先搜索
while (!q.empty()) {
int i= q.front().first;
int j=q.front().second;
q.pop();
for (int d = 0; d < 4; ++d) {
int ni = i + dirs[d][0];
int nj = j + dirs[d][1];
if (ni >= 0 && ni < m && nj >= 0 && nj < n && !seen[ni][nj]) {
dist[ni][nj] = dist[i][j] + 1;
q.emplace(ni, nj);
seen[ni][nj] = 1;
}
}
}
return dist;
}