###### tags: `LeetCode` `Medium` `Queue` `BFS`
# LeetCode #542 [01 Matrix](https://leetcode.com/problems/01-matrix/)
### (Medium)
給定一個由 0 和 1 組成的矩陣 mat ,請輸出一個大小相同的矩陣,其中每一個格子是 mat 中對應位置元素到最近的 0 的距離。
兩個相鄰元素間的距離為 1 。
---
先建立一二維數組儲存矩陣元素對應的與0的距離, 初始值(0:0, 非0:-1)。
將所有值為0的座標點存入佇列中, 並以這些座標點進行往外DFS, 若遇到的座標點的值不是-1, 則要嘛是0, 要嘛是之前已經被探索過的節點(而由於BFS特性, 必定為與0節點的最短距離)。 將遇到的座標值為-1的座標存入佇列中, 並修改該座標的值為現在節點的距離值+1, 如此重複直到遇到的座標點皆不為-1, 此時換下一個佇列元素進行探索。
注意邊界條件。
---
```
class Solution {
public:
vector<vector<int>> dir{{-1,0},{0,1},{1,0},{0,-1}};
vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
queue<pair<int,int>> q;
int m = mat.size();
int n = mat[0].size();
vector<vector<int>> ans(m, vector<int>(n, -1));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(mat[i][j]==0){
ans[i][j]=0;
q.push({i,j});
}
}
}
while(!q.empty()){
for(int i=q.size();i>0;i--){
pair<int,int> p = q.front();q.pop();
for(auto& x:dir){
int a=p.first+x[0];
int b=p.second+x[1];
if(isvalid(a,b,m,n)&&ans[a][b]==-1){
q.push({a,b});
ans[a][b]=ans[p.first][p.second]+1;
}
}
}
}
return ans;
}
bool isvalid(int i, int j, int m, int n){
if(i==m||j==n||i<0||j<0)return false;
return true;
}
};
```