<모든 코드는 C++를 기반으로 작성되었습니다.>
0
일 때 진행한다. #include <iostream>
using namespace std;
static int N, M;
static bool ice[1000][1000];
static constexpr int moving[4][2] {
{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
inline bool isSafe(int y, int x) {
return ((0 <= y && y < N) && (0 <= x && x < M));
}
void dfs(int y, int x) {
ice[y][x] = true;
for (int i = 0; i < 4; ++i) {
int newY = y + moving[i][0], newX = x + moving[i][1];
if (isSafe(newY, newX) && !ice[newY][newX]) dfs(newY, newX);
}
}
int solve() {
int ret = 0;
for (int i = 0; i < N; ++i)
for (int j = 0; j < M; ++j) // 모든 좌표에 대해 DFS를 돌린다.
if (!ice[i][j]) { dfs(i, j); ret++;}
return ret;
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> N >> M;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
int input = 0; cin >> input;
ice[i][j] = (input == 0) ? false : true;
}
}
cout << solve() << '\n';
}
bool
타입으로 구현했고, isVisited[]
배열을 사용하지 않았다. 왜냐하면 탐색된 칸을 1
또는 true
로 바꿔주면 되기 때문이다. #include <iostream>
#include <queue>
#include <tuple>
using namespace std;
static int N, M;
static bool maze[200][200];
static constexpr int moving[4][2] {
{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
inline bool isSafe(int y, int x) {
return ((0 <= y && y < N) && (0 <= x && x < M));
}
int solve() {
queue<tuple<int, int, int>> q;
q.push(make_tuple(0, 0, 1));
while (!q.empty()) {
int y, x, cost; tie(y, x, cost) = q.front();
q.pop();
maze[y][x] = false;
if (y == N - 1 && x == M - 1) return cost;
for (int i = 0; i < 4; ++i) {
int newY = y + moving[i][0], newX = x + moving[i][1];
if (isSafe(newY, newX) && maze[newY][newX])
q.push(make_tuple(newY, newX, cost + 1));
}
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> N >> M;
for (int i = 0; i < N; ++i)
for (int j = 0; j < M; ++j) {
int input = 0; cin >> input;
maze[i][j] = (input == 0) ? false : true;
}
cout << solve() << '\n';
}
tuple
자료구조를 쓰지 않고 외부에 변수를 하나 더 만들어서 시작지점으로부터 (y, x)
까지 이르는 최단거리를 기록하는 방식으로 푸는게 맞다.solve()
함수는 조건에 해당할 때만 return 되도록 만들어도 된다. while()문이 종료되는 경우는 없다.