<C/C++> BOJ 14503 λ‘λ΄μ²μκΈ°
https://www.acmicpc.net/problem/14503
14503λ²: λ‘λ΄ μ²μκΈ°
λ‘λ΄ μ²μκΈ°κ° μ£Όμ΄μ‘μ λ, μ²μνλ μμμ κ°μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€. λ‘λ΄ μ²μκΈ°κ° μλ μ₯μλ N×M ν¬κΈ°μ μ§μ¬κ°νμΌλ‘ λνλΌ μ μμΌλ©°, 1×1ν¬κΈ°μ μ μ¬κ°ν μΉΈμΌλ‘ λλμ΄
www.acmicpc.net
DFSλ₯Ό μ¬μ©ν΄μ νμλ€. μ΄μ μ νμλ λ¬Έμ μ μ’ λ¬λλ λΆλΆμ λ³΄ν΅ ν κ΅°λ°μμλ§ DFSλ₯Ό μ€ννλ μ¬κ·ν¨μ ꡬ쑰μΈλ° μ΄ κ²½μ°μλ 쑰건μ λ°λΌ λ κ΅°λ°μμ μ€νλ μ μλ€λ μ μ΄μλ€. λ¬Όλ‘ νλ²λ§ μ€νλλ 건 λμΌ!
κ·Έλ¦¬κ³ ν λΆλΆμμ μ€μνλ€. λ¬Έμ μμ λ μ²μν μ μλ κ³΅κ° μμΌλ©΄ "λ°©ν₯μ μ μ§ν μ±" νμ§μ ν΄μΌλλ€κ³ νμλ€. νμ§λ§ "νμ§νλ λ°©ν₯μΌλ‘ λ°κΎΈκ³ " νμ΄μ μ λλ‘ μ€νλμ§ μμμλ€.
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
#define MAXN 50
int N, M;
int R, C, D;
int map[MAXN+10][MAXN+10];
int visited[MAXN+10][MAXN+10];
static int dr[] = { -1, 0, 1, 0 };
static int dc[] = { 0, 1, 0, -1 };
int cnt;
void InputData(void) {
cin >> N >> M;
cin >> R >> C >> D;
memset (map, 0, sizeof(map));
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
visited[R][C] = 1;
cnt ++;
}
void Solve(void) {
int nr, nc, dir;
int flag = 0;
for(int i = 1; i <= 4; i++){
dir = (D + 4 - i) % 4;
nr = R + dr[dir]; // μΌμͺ½μΌλ‘ λλ¦°λ€
nc = C + dc[dir];
if(map[nr][nc] == 1 || visited[nr][nc]) continue; // λ²½, μ²μ
if(nr<0||nr>=N||nc<0||nc>=M) continue; // λ²μ λ°
visited[nr][nc] = 1;
flag = 1;
R = nr, C = nc, D = dir;
cnt ++;
Solve();
break;
}
if(flag == 0) {
dir = (D + 2) % 4; // λ°©ν₯ μ μ§ν μ±λ‘ νμ§ν΄μΌνλλ° λ°©ν₯μ λ°λλ‘ λ°κΏ.
R += dr[dir], C += dc[dir]; //νμ§
if(R<0||R>=N||C<0||C>=M) return; // λ²μ λ°
if (map[R][C] == 0) Solve(); // νμ§ν μ μμ
else return; // νμ§ λͺ»ν¨
}
// μ²μν 곡κ°μ΄λΌλ©΄ λ°©ν₯ λ리기
// λ€ λ°©ν₯ λ€ λλ Έλλ° λ€ μ²μνκ³ λ²½μ΄λ©΄
// νμ§νκΈ°
// νμ§λ λͺ»νλ©΄ λ
// μ²μμνμΌλ©΄ μ μ§ν΄μ μ²μνκΈ°
}
int main(void) {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
InputData();
Solve();
cout<<cnt<<endl;
return 0;
}