백준 algorithm
백준 2178 - 미로탐색 C++
cosmohoo
2022. 3. 28. 17:45
반응형
입력
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착 위치로 이동할 수 있는 경우만 입력으로 주어진다.
예제 입력 1 복사
4 6
101111
101010
101011
111011
예제 출력 1 복사
15
예제 입력 2 복사
4 6
110110
110110
111111
111101
예제 출력 2 복사
9
예제 입력 3 복사
2 25
1011101110111011101110111
1110111011101110111011101
예제 출력 3 복사
38
예제 입력 4 복사
7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111
예제 출력 4 복사
13
=> BFS를 이용해서 풀 수 있는 문제였습니다.
=> 저는 시작점을 세지 않았기 때문에 맨마지막에 1을 더해서 출력하였습니다.
=> 현재위치에서 갈 수 있는 위치에 대한 Validation과정에서 시간을 많이 소요하였습니다.
=> nx는 N 미만이고 , ny는 M 미만입니다.
=> 풀이과정은 아래에 이미지로 첨부하였습니다.
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <iostream>
#include <queue>
#include <utility>
using namespace std;
int N,M; //초기변수값 N*M
string mp[100]; //주어진 미로를 저장할 map
int dis[100][100]; //최소거리를 저장할 변수, <0,0>에서 <0,1>을 가면 <0,1>에는 1이 저장된다.
int dx[4] = {0,1,0,-1};//인접한 곳만 갈 수 있도록 하는 변수
int dy[4] = {1,0,-1,0};
queue<pair<int, int>> quePair;
void BFS(int x, int y)
{
quePair.push(make_pair(x,y));
int tmpX, tmpY;
while(!quePair.empty())
{
tmpX=quePair.front().first;
tmpY=quePair.front().second;
quePair.pop();
for(int i=0; i<4; i++)
{
int nx = tmpX + dx[i];
int ny = tmpY + dy[i];
if( (nx >= 0) && (nx < N) && (ny >= 0) && (ny < M) && (mp[nx][ny] == '1') && (dis[nx][ny] == 0) ) //map은 string이니까 소괄호 해주고, dis는 int니까 필요없다.
{
quePair.push(make_pair(nx,ny));
dis[nx][ny]=dis[tmpX][tmpY]+1;
}
}
}
}
int main()
{
cin >> N >> M;
for(int i=0; i<N; i++)
{
cin >>mp[i];
}
BFS(0,0);
cout <<dis[N-1][M-1]+1;
return 0;
}
반응형