최근은 프로그래머스 문제만 풀다가 오랜만에 풀어보는 백준 문제.
확실히 백준 문제는 코드를 다 작성해야해서 번거롭지만 편안하다...
다익스트라
문제를 풀어보기 위해서 고른 문제였는데BFS
에서cost
값만 추가해서 돌려줬는데, 이게다익스트라
라니...
void bfs()
{
queue<pair<int, int> >q;
memset(broke, 10001, sizeof(broke));
q.push(make_pair(0, 0));
broke[0][0] = 0;
while(!q.empty())
{
int y = q.front().first;
int x = q.front().second;
int aoj = broke[y][x];
q.pop();
for (int i = 0; i < 4; i++)
{
int ny = y + dy[i];
int nx = x + dx[i];
if(ny >= N || nx >= M || ny < 0 || nx < 0)
continue;
if(maze[ny][nx]==0 && broke[ny][nx] > broke[y][x])
{
broke[ny][nx] = broke[y][x];
q.push(make_pair(ny, nx));
}
else if(maze[ny][nx]==1 && broke[y][x]+1 < broke[ny][nx])
{
broke[ny][nx] = broke[y][x] + 1;
q.push(make_pair(ny, nx));
}
}
}
}
BFS
처럼 작성하되 broke
배열로 벽을 부순 수를 저장해줬다.broke
는 최대값으로 초기화시켜줬다.broke
가 다음 칸의 broke
보다 작다면 다음 칸의 broke
를 갱신시킨다.check
의 기능 또한 가진다.broke+1
이 다음 칸의 broke
보다 작다면 다음 칸의 broke
를 갱신시킨다. #include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <string.h>
using namespace std;
#define endl "\n"
int N, M;
int maze[101][101];
int broke[101][101];
int dy[4] = {1, -1, 0, 0};
int dx[4] = {0, 0, 1, -1};
void bfs()
{
queue<pair<int, int> >q;
memset(broke, 10001, sizeof(broke));
q.push(make_pair(0, 0));
broke[0][0] = 0;
while(!q.empty())
{
int y = q.front().first;
int x = q.front().second;
int aoj = broke[y][x];
q.pop();
for (int i = 0; i < 4; i++)
{
int ny = y + dy[i];
int nx = x + dx[i];
if(ny >= N || nx >= M || ny < 0 || nx < 0)
continue;
if(maze[ny][nx]==0 && broke[ny][nx] > broke[y][x])
{
broke[ny][nx] = broke[y][x];
q.push(make_pair(ny, nx));
}
else if(maze[ny][nx]==1 && broke[y][x]+1 < broke[ny][nx])
{
broke[ny][nx] = broke[y][x] + 1;
q.push(make_pair(ny, nx));
}
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> M >> N;
for (int i = 0; i < N; i++)
{
string s;
cin >> s;
for (int j = 0; j < M; j++)
{
maze[i][j] = s[j] - '0';
}
}
bfs();
cout << broke[N-1][M-1] << endl;
}
필자는 지금까지 이것이 단순
BFS
문제인줄 알았다. 그런데다익스트라
란다. 가는 경로가 1씩 증가하는다익스트라
인건가 ㅋㅋ