<C/C++> BOJ 14500: ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

https://www.acmicpc.net/problem/14500

 

14500๋ฒˆ: ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ž€ ํฌ๊ธฐ๊ฐ€ 1×1์ธ ์ •์‚ฌ๊ฐํ˜•์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ด์–ด์„œ ๋ถ™์ธ ๋„ํ˜•์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์€ ์„œ๋กœ ๊ฒน์น˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋„ํ˜•์€ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€

www.acmicpc.net

 

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
#define MAXN 500
int N, M;
int sol, mx;
int map[MAXN + 10][MAXN + 10];
int visited[MAXN + 10][MAXN + 10];
static int dr[] = { -1, 1, 0, 0 };
static int dc[] = { 0, 0, -1, 1 }; 
static int tet[][3] = { {0, 1, 2}, {1, 2, 3}, {0, 1, 3}, {0, 2, 3} };

void Input(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> map[i][j];
			if (mx < map[i][j]) mx = map[i][j];
		}
	}
}
void DFS(int r, int c, int t, int sum) {
	int nr, nc;
	if (t >= 4) {
		if (sol < sum) sol = sum;
		return;
	}
	if (sol >= mx*(4 - t) + sum) return;
	for (int i = 0; i < 4; i++) {
		nr = r + dr[i], nc = c + dc[i];
		if (visited[nr][nc]) continue;
		if (nr >= N || nr < 0 || nc >= M || nc < 0) continue;
		visited[nr][nc] = 1;
		DFS(nr, nc, t + 1, sum + map[nr][nc]);
		visited[nr][nc] = 0;
	}
}

void check() {
	int sum, nr, nc, dir;
	for (int i = 0; i < N; i++) { //ํšจ์œจ ๋†’์ด๋ ค๊ณ  ๋ฒ”์œ„ ์ค„์˜€๋‹ค๊ฐ€ ํ…Œ์ผ€ ํ†ต๊ณผ๋„ ๋ชปํ•˜๊ฒŒ ๋„ˆ๋ฌด ์ค„์ž„
		for (int j = 0; j < M; j++) {
			for (int k = 0; k < 4; k++) {
				sum = map[i][j];
				for (int idx = 0; idx < 3; idx++) {
					dir = tet[k][idx];
					nr = i + dr[dir], nc = j + dc[dir];
					if (nr >= N || nr < 0 || nc >= M || nc < 0) break;
					sum += map[nr][nc];
				}
				if (sol < sum) sol = sum;
			}
		}
	}
}
int main(void) {
	Input();
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			visited[i][j] = 1;
			DFS(i, j, 1, map[i][j]);
			visited[i][j] = 0;
		}
	}
	check();
	cout << sol << endl;
	return 0;
}

 DFS ์‚ฌ์šฉ
 ๋‹จ 'ใ…œ'๋ชจ์–‘์€ DFS๋กœ ํ•  ๋ฐฉ๋ฒ• ๋ชป์ฐพ๊ฒ ์–ด์„œ ์˜ˆ์™ธ๋กœ check ํ•จ์ˆ˜ ๋งŒ๋“ค์—ˆ์Œ
 ์—ฌ๊ธฐ์„œ ํšจ์œจ ๋†’์ด๋ ค๋‹ค๊ฐ€ ๋ฒ”์œ„ ์กฐ์ • ์‹ค์ˆ˜ํ•จ. ์—์ง€์ผ€์ด์Šค๋“ค ์ž˜ ์žก์•„๋‚ด์ž!