1. parent 방식을 이용할 수 있지만 반복문을 한 번 더 돌기 때문에 시간초과가 난다. 거리 계산 방식을 이용해야한다.
2. 방문을 다음 갈 곳을 찾았을때 바로 방문 했다고 알려줘야한다. 다음 이어지는 공간에서 중복되는 문제가 생긴다. 메모리 초과
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <string>
using namespace std;
int dy[4] = { 0,0,1,-1 };
int dx[4] = { -1,1,0,0 };
struct Pos
{
Pos(int X, int Y)
{
y = Y;
x = X;
}
Pos() = default;
int y;
int x;
bool operator<(const Pos& other) const
{
if (y != other.y)
return y < other.y;
return x < other.x;
}
bool operator!=(const Pos& other) const
{
if (y == other.y)
{
if (x == other.x)
{
return false;
}
}
return true;
}
bool operator==(const Pos& other) const
{
return !(*this != other);
}
};
int main(void)
{
int N;
int M;
cin >> N >> M;
int answer = 1;
int arr[101][101];
int dis[101][101];
for (int i = 1; i <= N; ++i)
{
string str;
cin >> str;
for (int j = 1; j <= M; ++j)
{
arr[i][j] = str[j-1] - '0';
}
}
//map<Pos, Pos> parent;
Pos pos(1, 1);
int g = N + 1;
int h = M + 1;
vector<vector<bool>> visited(g, vector<bool>(h, false));
//parent[pos] = pos;
dis[1][1] = 1;
visited[pos.x][pos.y] = true;
queue<Pos> q;
q.push(pos);
Pos dest(N, M);
while (!q.empty())
{
pos = q.front();
q.pop();
if (pos == dest)
{
break;
}
for (int i = 0; i < 4; ++i)
{
int x = pos.x + dx[i];
int y = pos.y + dy[i];
if (x < 1 || x >= N + 1 || y < 1 || y >= M + 1)
{
continue;
}
if (visited[x][y] == true)
{
continue;
}
if (arr[x][y] == 0)
{
continue;
}
q.push(Pos(x, y));
dis[x][y] = dis[pos.x][pos.y] + 1;
visited[x][y] = true;
//parent[Pos(x, y)] = pos;
}
}
//pos = dest;
//
//while (true)
//{
// if (parent[pos] == pos)
// {
// break;
// }
// pos = parent[pos];
// answer++;
//}
answer = dis[dest.x][dest.y];
cout << answer;
return 0;
}
'코딩 테스트' 카테고리의 다른 글
백준 7562 나이트의 이동 (0) | 2024.08.25 |
---|---|
백준 1260 Bfs, Dfs (0) | 2024.08.25 |
프로그래머스 - 구명보트 (0) | 2024.08.23 |
프로그래머스 - 스킬트리 (0) | 2024.08.22 |
프로그래머스 - 더 맵게 (0) | 2024.08.09 |