BFS/DFS
로 푸는 문제. 난 BFS
로 풀었다.
BFS
는 queue
로 풀어야 하기 때문에 현재 위치 (0,0)
을 큐에 넣는다.visit
과 거리를 나타내는 dist
에도 [0][0]
값을 1
로 갱신한다.queue
가 빌 때까지 반복하는데, 현재 위치 curX
와 curY
에서 상하좌우 값을 구해(nx
, ny
) 범위를 벗어나거나, 벽이거나, 방문했으면 continue 해준다.queue
에 넣어주고, dist
와 visit
값을 갱신한다.dist[n-1][m-1]
값을 return 해주면 끝.#include <vector>
#include <queue>
using namespace std;
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
vector<vector<int>> maps;
void BFS(int n, int m, vector<vector<int>> &dist)
{
vector<vector<int>> visit(n,vector<int>(m));
queue<pair<int,int>> q;
q.push(make_pair(0,0));
dist[0][0] = 1;
visit[0][0] = 1;
while(!q.empty())
{
int curX = q.front().second;
int curY = q.front().first;
q.pop();
for(int i=0;i<4;i++)
{
int nx = curX + dx[i];
int ny = curY + dy[i];
if(nx>=m || nx<0 || ny>=n || ny<0) continue;
if(maps[ny][nx]==0) continue;
if(visit[ny][nx]==1) continue;
q.push(make_pair(ny,nx));
dist[ny][nx] = dist[curY][curX]+1;
visit[ny][nx] = 1;
}
}
}
int solution(vector<vector<int>> maps)
{
int answer = 0;
::maps = maps;
int n = maps.size();
int m = maps[0].size();
vector<vector<int>> dist(n, vector<int>(m));
BFS(n,m,dist);
answer = dist[n-1][m-1];
if(answer==0) return -1;
return answer;
}