https://school.programmers.co.kr/learn/courses/30/lessons/1844
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
struct Pos{
int i, j;
int distance;
};
void Prints(vector<vector<int>> maps){
for(int i=0;i<maps.size();i++){
for(int j=0;j<maps[i].size();j++){
cout<<maps[i][j];
}
cout<<endl;
}
}
int solution(vector<vector<int>> maps){
int answer = -1;
int n = maps.size();
int m = maps[0].size();
// 상하좌우 방향 벡터
int dr[] = {-1, 1, 0, 0};
int dc[] = {0, 0, -1, 1};
// 시작 위치를 큐에 추가합니다.
queue<Pos> q;
q.push({0, 0, 1});
while(!q.empty()){
// 큐에서 현재 위치를 꺼냅니다.
Pos cur = q.front();
q.pop();
cout<<endl;
Prints(maps);
cout<<endl;
// 도착 지점에 도달한 경우, 거리를 반환합니다.
if(cur.i == n - 1 && cur.j == m - 1){
answer = cur.distance;
break;
}
// 현재 위치에서 이동할 수 있는 상하좌우를 탐색합니다.
for(int k = 0; k < 4; k++){
int nr = cur.i + dr[k];
int nc = cur.j + dc[k];
if(nr >= 0 && nr < n && nc >= 0 && nc < m && maps[nr][nc] == 1){
// 이동 가능한 경우, 다음 위치를 큐에 추가합니다.
q.push({nr, nc, cur.distance + 1});
// 이동한 위치를 벽으로 표시합니다.
maps[nr][nc] = 0;
}
}
}
return answer;
}