๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

 

18430๋ฒˆ: ๋ฌด๊ธฐ ๊ณตํ•™

์ฒซ์งธ ์ค„์—๋Š” ๊ธธ๋™์ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‚˜๋ฌด ์žฌ๋ฃŒ์˜ ์„ธ๋กœ, ๊ฐ€๋กœ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋‘ ์ž์—ฐ์ˆ˜ N, M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N, M ≤ 5) ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ, ๋งค ์ค„๋งˆ๋‹ค ๋‚˜๋ฌด ์žฌ๋ฃŒ์˜ ๊ฐ ์œ„์น˜์˜ ๊ฐ•๋„๋ฅผ ๋‚˜ํƒ€๋‚ด

www.acmicpc.net


1. ๋ฌธ์ œ ์š”์•ฝ

NxMํฌ๊ธฐ์˜ map์—์„œ ๋ถ€๋ฉ”๋ž‘์€ ํ•ญ์ƒ 3์นธ์„ ์ฐจ์ง€ํ•˜๋Š” ์•„๋ž˜์˜ 4๊ฐœ์˜ ๋ชจ์–‘๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ถ€๋ฉ”๋ž‘์˜ ๊ฐ•๋„๋Š” ๋ถ€๋ฉ”๋ž‘ 3์นธ์— ํ•ด๋‹นํ•˜๋Š” map ๊ฐ’์˜ ํ•ฉ์ด๋ฉฐ, ๋ถ€๋ฉ”๋ž‘์˜ ์ค‘์‹ฌ์ด ๋˜๋Š” ์นธ์€ map ๊ฐ’์˜ 2๋ฐฐ๊ฐ€ ๋œ๋‹ค.

์ฆ‰, ์ด ๋…€์„์˜ ๊ฐ•๋„๋Š” 5 + 2*2 + 9 ์ธ ์…ˆ์ด๋‹ค.

๊ฐ•๋„ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

[์ œ์•ฝ์กฐ๊ฑด]

- map์˜ ํฌ๊ธฐ๊ฐ€ ๋ถ€๋ฉ”๋ž‘์ด ์žˆ์„ ์ˆ˜ ์—†๋Š” ํฌ๊ธฐ๋ผ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

2. ํ’€์ด

๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ์ด๋‹ค.

๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ๊ทธ ์ค‘์—์„œ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค.

 

1. dfs๋ฅผ ๋Œ ๋•Œ๋งˆ๋‹ค ๊ฐ•๋„ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ฃผ์—ˆ๋‹ค. 

     - ๊ฐ ๊ฒฝ์šฐ๋งˆ๋‹ค dfs๊ฐ€ ๋๋‚˜๋Š” ์ง€์ ์ด ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.(dfs๊ฐ€ ์–ธ์ œ ๋๋‚ ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ)

2. => ๋ฐฉํ–ฅ์œผ๋กœ ์ญ‰ x๊ฐ’์„ +1ํ•ด์ฃผ๋‹ค๊ฐ€ x>=M ์ด ๋  ๊ฒฝ์šฐ y๊ฐ’์„ ๋Š˜๋ ค์ฃผ๊ณ  x๊ฐ’์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์คฌ๋‹ค.

3. ์ด ๋•Œ y>=N๋ผ๋ฉด, (y์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ๋‹ค๋ฉด) returnํ•˜์—ฌ ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.

4. ์ด๋ฏธ y, x ์ขŒํ‘œ์— ๋ถ€๋ฉ”๋ž‘์ด ๋†“์—ฌ์ ธ ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ์ขŒํ‘œ(=>)๋กœ dfs๋ฅผ ๋ˆ๋‹ค.

5. ์•„์ง y, x ์ขŒํ‘œ์— ๋ถ€๋ฉ”๋ž‘์ด ๋†“์—ฌ์ ธ ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ๋ถ€๋ฉ”๋ž‘์˜ ์ค‘์‹ฌ์œผ๋กœ 4๊ฐ€์ง€ ํƒ€์ž…์˜ ๋ถ€๋ฉ”๋ž‘์„ ์ „๋ถ€ ๋†“์•„๋ณธ๋‹ค.

    - ๋†“์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ˆ„์ ํ•ฉ์— ํ˜„์žฌ ๋ถ€๋ฉ”๋ž‘ ๊ฐ•๋„ ํ•ฉ์„ ๋”ํ•ด์ฃผ๊ณ , ๋‹ค์Œ์ขŒํ‘œ(=>)๋กœ dfs๋ฅผ ๋ˆ๋‹ค.

    - ๋†“์„ ์ˆ˜ ์—†๋‹ค๋ฉด, (4๊ฐ€์ง€ ํƒ€์ž…์„ ๋‹ค ๋ดค๋Š”๋ฐ๋„ ๋†“์„ ์ˆ˜ ์—†์–ด์„œ for๋ฌธ์ด ๋๋‚ฌ๋‹ค๋ฉด)

      ๋ˆ„์ ํ•ฉ ๊ทธ๋Œ€๋กœ ๋‹ค์Œ์ขŒํ‘œ(=>)๋กœ dfs๋ฅผ ๋ˆ๋‹ค.

 

๋งจ ๋งˆ์ง€๋ง‰ ์กฐ๊ฑด์—์„œ ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค.

 

3. ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.*;
import java.util.*;

public class BOJ_18430_๋ฌด๊ธฐ๊ณตํ•™ {

	static int N, M, ans;
	static int[][] map;
	static boolean[][] visited;
	
	static int[] dy1= {-1,-1, 0, 0};
	static int[] dx1= { 0, 0,-1, 1};
	static int[] dy2= { 0, 0, 1, 1};
	static int[] dx2= { 1,-1, 0, 0};
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		map = new int[N][M];
		visited = new boolean[N][M];
		
		for (int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j=0; j<M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		} // ์ž…๋ ฅ ๋
		
		if(N<2 || M<2) {
			System.out.println(0);
			return;
		}
		
		dfs(0,0,0);
		System.out.println(ans);
	}
	
	static void dfs(int y, int x, int sum) {
		ans = Math.max(ans, sum);
		if (x>=M) {
			y++;
			x=0;
		}
		if (y>=N) return;
		
		if (visited[y][x]) {
			dfs(y,x+1,sum);
		} else {

			for (int type=0; type<4; type++) {
				int ny1 = y+dy1[type];
				int nx1 = x+dx1[type];
				int ny2 = y+dy2[type];
				int nx2 = x+dx2[type];
				if (ny1<0 || ny1>=N || nx1<0 || nx1>=M || visited[ny1][nx1]) continue;
				if (ny2<0 || ny2>=N || nx2<0 || nx2>=M || visited[ny2][nx2]) continue;
				
				visited[ny1][nx1] = true;
				visited[ny2][nx2] = true;
				visited[y][x] = true;
				
				int power = map[ny1][nx1] + map[ny2][nx2] + map[y][x]*2;
				dfs( y, x+1, sum+power);
				
				visited[ny1][nx1] = false;
				visited[ny2][nx2] = false;
				visited[y][x] = false;
			}
			dfs( y, x+1, sum);
		}
	}
}