Study/Algorithm
BOJ (C/C++) 1261번: 알고스팟
hwooo
2022. 12. 2. 03:38
https://www.acmicpc.net/problem/1261
1261번: 알고스팟
첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미
www.acmicpc.net
풀이
다익스트라 알고리즘 사용, 상하좌우로 움직이며 방문할 노드의 값이 갱신되면 큐에 삽입.코드
#include <stdio.h>
#include <queue>
using namespace std;
int Maze[100][100], Cnt[100][100];
queue <pair<int, int>> Q;
void Init(int N, int M) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++)
Cnt[i][j] = 1000000;
}
Cnt[0][0] = 0;
}
int Dijkstra(int N, int M) {
int move[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };
int x, y, nx, ny;
Init(N, M);
Q.push({ 0,0 });
while (!Q.empty()) {
x = Q.front().first, y = Q.front().second;
Q.pop();
for (int i = 0; i < 4; i++) {
nx = x + move[i][0], ny = y + move[i][1];
if (0 <= nx && nx < N && 0 <= ny && ny < M) {
if (Cnt[nx][ny] > Cnt[x][y] + Maze[nx][ny]) {
Cnt[nx][ny] = Cnt[x][y] + Maze[nx][ny];
Q.push({ nx,ny });
}
}
}
}
return Cnt[N - 1][M - 1];
}
int main() {
int M, N;
char s[101];
scanf("%d %d", &M, &N);
for (int i = 0; i < N; i++) {
scanf("%s", s);
for (int j = 0; j < M; j++) {
Maze[i][j] = s[j] - '0';
}
}
printf("%d", Dijkstra(N, M));
return 0;
}