반응형
문제
N×M크기의 배열로 표현되는 미로가 있다.
1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 1 |
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
입력
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
풀이
BFS알고리즘을 이용하여 풀이하였다.
처음엔 메모리 초과가 나서 왜지 ?! 했는데 방문 여부를 확인할 때 사용하는 visited배열을 적절한 위치에서 1로 바꿔주지 않아서 였다. 큐에 push해줄 때 마다 1로 만들어 줬어야 했는데 실수 했다ㅠㅠㅠ
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
char map[101][101];
int visited[101][101];
queue<pair<pair<int, int>, int>> check;
int X[4] = {1, -1, 0, 0};
int Y[4] = {0, 0, 1, -1};
int main(void){
int n, m;
int x, y, n_x, n_y;
int cnt;
int result= -1;
scanf("%d %d", &n, &m);
for(int i=0; i<n; i++){
scanf("%s", map[i]);
}
check.push(make_pair(make_pair(0, 0), 1));
visited[0][0] = 1;
while(!check.empty()){
x = check.front().first.first;
y = check.front().first.second;
cnt = check.front().second;
check.pop();
if(x == n-1 && y == m-1){
result = cnt;
break;
}
for(int i=0; i<4; i++){
n_x = x+X[i];
n_y = y+Y[i];
if(n_x < 0 || n_x >= n || n_y < 0 || n_y >= m)
continue;
if(map[n_x][n_y] == '0' || visited[n_x][n_y] == 1)
continue;
check.push(make_pair(make_pair(n_x, n_y), cnt+1));
visited[n_x][n_y] = 1;
}
}
printf("%d\n", cnt);
}
728x90
반응형
'알고리즘 > PS - 백준' 카테고리의 다른 글
[백준 2251 - C++] 물통 : BFS (0) | 2021.04.11 |
---|---|
[백준 7562 - C++] 나이트의 이동 : BFS (0) | 2021.04.10 |
[백준 2644 - C++] 촌수 계산 : BFS / DFS (0) | 2021.04.10 |
[백준 1937 - C++] 욕심쟁이 판다 : DFS + DP (0) | 2021.04.05 |
[백준 2458 - C++] 키 순서 : DFS (0) | 2021.04.05 |