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