728x90
board는 미로의 크기를 나타내는 배열, vis는 해당 지점을 방문했는지 나타는 배열, length는 시작 지점에서부터 해당 지점까지의 거리를 나타낸다.
n, m은 미로의 세로와 가로의 길이를 나타내고 한 줄씩 string 값을 입력받아 board에 저장한다.
첫번째 (0,0)을 큐에 넣고 vis[0][0]을 1로 바꾸고 이중for문을 사용하여 length 배열의 값들을 넣어준다. 마지막에 1을 더한 이유는 length에 저장되어 있는 값은 거리값이고 해당 문제에서 요구하는 것은 이동한 칸의 갯수이므로 +1을 해준다.
전체코드
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define X first
#define Y second
int board[101][101] = { 0, };
bool vis[101][101];
int length[101][101] = { 0, };
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
string str;
cin >> str;
int k = 0;
for (int j = 0; j < m; j++) {
board[i][j] = str[k] - '0';
if (k < str.length() - 1)
k++;
}
}
queue<pair<int, int>> Q;
vis[0][0] = 1;
Q.push({ 0,0 });
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
while (!Q.empty()) {
pair<int, int> cur = Q.front();
Q.pop();
for (int dir = 0; dir < 4; dir++) {
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m)
continue;
if (vis[nx][ny] || board[nx][ny] != 1)
continue;
vis[nx][ny] = 1;
length[nx][ny] = length[cur.X][cur.Y] + 1;
Q.push({ nx,ny });
}
}
}
}
cout << length[n-1][m-1] + 1;
return 0;
}
728x90
반응형
'코딩테스트 > c++' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 (3) | 2021.07.06 |
---|---|
[백준] 3273번 두 수의 합 (2) | 2021.06.30 |
[백준] 1406번 에디터 (0) | 2021.06.29 |
백준 c++ 1697번 (2) | 2021.01.22 |
백준 c++ 1926번 (0) | 2021.01.19 |