hades

[Baekjoon] 14500๋ฒˆ: ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ ๋ณธ๋ฌธ

๐Ÿ‘Š PS/Algorithm

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

hades1 2024. 7. 26. 12:39

๐Ÿฅ… ๋ฌธ์ œ

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

 

๐Ÿ” ์„ค๊ณ„

์ฒ˜์Œ์—๋Š” ์‹œ์ž‘ ์ขŒํ‘œ๋ฅผ ์žก๊ณ , ๊ทธ ์ขŒํ‘œ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ ์ผ€์ด์Šค๋ฅผ ๋ชจ๋‘ ๋งŒ๋“ค์–ด์„œ ๊ฐ’์„ ๋„์ถœํ•˜๋ ค ํ–ˆ์œผ๋‚˜, ๋Œ€์นญ๊ณผ ํšŒ์ „๊นŒ์ง€ ๊ณ ๋ คํ–ˆ์„ ๋•Œ, ์ผ€์ด์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง„๋‹ค.

 

ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ์˜ ํŠน์ง•์€ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ, DFS๋ฅผ ์ด์šฉํ•˜์—ฌ 4๊ฐœ์˜ ์นธ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (poli)

 

ํ•˜์ง€๋งŒ, ใ…— ๋ชจ์–‘์˜ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋Š” ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ ํ™•์žฅํ•ด๋‚˜๊ฐ€๋Š” DFS๋กœ ๊ตฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ใ…— ๋ชจ์–‘์„ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๅ ๋ชจ์–‘์˜ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋ฅผ ๋งŒ๋“ค๊ณ , ์ƒํ•˜์ขŒ์šฐ์—์„œ ํ•˜๋‚˜์”ฉ ๋นผ๋ฉด ๋œ๋‹ค. ๅ ๋ชจ์–‘์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ, ์นธ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ œ์™ธ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๊ณ , ์ œ์™ธ๋œ ๋ชจ์–‘์ด ใ…— ๋ชจ์–‘์„ ์ด๋ฃฐ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๊ทธ๋Œ€๋กœ ๊ฐฑ์‹  ์‹œ๋„๋ฅผ ํ•˜๊ณ , ใ…— ๋ชจ์–‘์„ ๋ชป ์ด๋ฃจ์—ˆ๋‹ค๋ฉด poli์—์„œ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ๋‹ค.

 

๐Ÿ‘Š ํ’€์ด

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m, result = 0;
vector<vector<int>> paper(500, vector<int>(500));
vector<vector<bool>> visited(500, vector<bool>(500));
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,1,-1 };


void poli(int x, int y, int count, int sum) {
	if (count == 4) {
		result = max(result, sum);
		return;
	}
	for (int i = 0; i < 4; i++) {
		int new_x = x + dx[i];
		int new_y = y + dy[i];
		if (!(new_x >= 0 && new_x < n && new_y >= 0 && new_y < m)) {
			continue;
		}
		if (!visited[new_x][new_y]) {
			visited[new_x][new_y] = true;
			poli(new_x, new_y, count + 1, sum + paper[new_x][new_y]);
			visited[new_x][new_y] = false;
		}
	}
}

void poli2(int x, int y) {
	int temp_result = paper[x][y];
	for (int i = 0; i < 4; i++) {
		int new_x = x + dx[i];
		int new_y = y + dy[i];
		if (!(new_x >= 0 && new_x < n && new_y >= 0 && new_y < m)) {
			continue;
		}
		temp_result += paper[new_x][new_y];
	}
	for (int i = 0; i < 4; i++) {
		int new_x = x + dx[i];
		int new_y = y + dy[i];
		if (!(new_x >= 0 && new_x < n && new_y >= 0 && new_y < m)) {
			result = max(result, temp_result);
			continue;
		}
		result = max(result, temp_result - paper[new_x][new_y]);
	}
}

int main(void)
{	
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> paper[i][j];
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			visited[i][j] = true;
			poli(i, j, 1, paper[i][j]);
			visited[i][j] = false;

			poli2(i, j);
		}
	}
	cout << result << "\n";
	return 0;
}