542. 01 矩陣(C++)---寬度優先搜索解題

題目詳情

給定一個由 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


注意:

  1. 給定矩陣的元素個數不超過 10000。
  2. 給定矩陣中至少有一個元素是 0。
  3. 矩陣中的元素只在四個方向上相鄰: 上、下、左、右。



——題目難度:中等


 



思路如下圖:




-解題代碼 
 

class Solution {
private:
	/*分別對應往上走、往下走、往左走、往右走*/ 
	int dir[4][2] = {{-1,0}, {1,0}, {0,-1}, {0,1}};
	
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
    	/*行數用n來表示,列數用m來表示*/ 
    	int n = matrix.size(), m = matrix[0].size();
		vector<vector<int>> dist(n, vector<int>(m));
		vector<vector<int>> used(n, vector<int>(m));
		queue<pair<int,int>> que;
		
		/*把0的位置加入隊列*/ 
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				if(matrix[i][j] == 0) {
					que.push(pair<int,int>(i, j));
					used[i][j] = 1;
				}
			}
		}
		
		/*廣度優先搜索*/
		while (!que.empty()) {
			pair<int,int> tmp = que.front();
			int i = tmp.first;
			int j = tmp.second;
			que.pop();
			
			for(int k=0;k<4;k++)
			{
				int h = i + dir[k][0]; 
				int l = j + dir[k][1]; 
				if(h >= 0 && h < n && l >=0 && l < m && !used[h][l]) {
					dist[h][l] = dist[i][j] + 1;
					que.push(pair<int,int>(h,l));
					used[h][l] = 1;
				}
			}
		}
		
		return dist;			
    }
};

結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章