解题思路:
采用BFS寻找最短路径。具体操作为:
1. 首先对矩阵进行一次循环,将所有的0压入队列中(寻找最短路径中已知的最短的一部分),将所有不是0 的标记为-1
2. 从队列中弹出一个,对四个方位进行遍历,没有访问过的位置得以更新最短路径,并压入队列
3. 矩阵中所有元素都被访问完即结束
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
//坐标(x,y)
typedef pair<int,int> p;
queue<p> q;
vector<vector<int>> res = matrix;
//进行第一次遍历
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(matrix[i][j]==0)
{
res[i][j] = 0;
q.push(p(i,j));
}
else
{
res[i][j] = -1;
}
}
}
//进行BFS
p dir[4] = {p(-1,0),p(1,0),p(0,-1),p(0,1)};
while(q.size())
{
p tmp = q.front();
q.pop();
int x = tmp.first;
int y = tmp.second;
//对四个方位进行访问
for(int i=0;i<4;i++)
{
int xx = x+dir[i].first;
int yy = y + dir[i].second;
if(xx>=0 && xx<rows && yy>=0 &&yy<cols && res[xx][yy]==-1)
{
res[xx][yy] = res[x][y]+1;
q.push(p(xx,yy));
}
}
}
return res;
}
两个知识点补充:
typedef的用途:
第一种:定义一种类型的别名,而不只是简单的宏替换。
typedef char* PCHAR; // 一般用大写
PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针
第二种:声明struct新对象时
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候
第三种:为复杂的声明定义一个新的简单的别名c++中pair的用法—将两个数据类型关联起来
标准库类型–pair类型定义在utility头文件中定义