542. 01 행렬

2299 단어
제목 설명
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 이다.행렬 중의 요 소 는 네 가지 방향 에서 만 인접 한다. 위, 아래, 왼쪽, 오른쪽 이다.
분석 하 다.
BFS 알고리즘 을 사용 하여 첫 번 째 단 계 는 행렬 을 옮 겨 다 니 며 모든 0 값 이 출발점 일 수 있 습 니 다. 대기 열 에 저장 하고 0 값 이 아 닌 INT 로 설정 합 니 다.MAX 두 번 째 단 계 는 대기 열 을 옮 겨 다 니 며 대기 열 머리의 점, x, y 를 가 져 옵 니 다.위, 아래, 왼쪽, 오른쪽 점 을 판단 하고 matrix [x] [y] + 1 보다 크 면 이 점 들 의 수 치 를 업데이트 하고 업 데 이 트 된 점 을 대기 열 에 넣 습 니 다. 이 점 들 이 업데이트 되 었 기 때문에 이 점 들 주위 의 점 들 도 업데이트 가 필요 할 수 있 습 니 다.
코드
class Solution {
public:
    vector> updateMatrix(vector>& matrix) {
        int row = matrix.size();
        int col = matrix[0].size();
        queue> q;
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                if(matrix[i][j] == 0) {
                    q.push(make_pair(i, j));
                } else {
                    matrix[i][j] = INT_MAX;
                }
            }
        }
        
        while(!q.empty()){
            auto p = q.front();
            int x = p.first;
            int y = p.second;
            q.pop();
            int cur = matrix[x][y] + 1;
            if(x > 0 && matrix[x - 1][y] > cur) {
                matrix[x-1][y] = cur;
                q.push(make_pair(x - 1, y));
            }
            if(x < row - 1 && matrix[x + 1][y] > cur) {
                matrix[x + 1][y] = cur;
                q.push(make_pair(x + 1, y));
            }
            if(y > 0 && matrix[x][y - 1] > cur) {
                matrix[x][y - 1] = cur;
                q.push(make_pair(x, y - 1));
            }
            if(y < col - 1 && matrix[x][y + 1] > cur) {
                matrix[x][y + 1] = cur;
                q.push(make_pair(x, y + 1));
            }
        }
        return matrix;
    }
};

제목 링크
https://leetcode-cn.com/problems/01-matrix/description/

좋은 웹페이지 즐겨찾기