Coding Test

<C/C++> BOJ 14503 λ‘œλ΄‡μ²­μ†ŒκΈ°

Deviloper😈 2022. 4. 2. 14:37

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;
}