03
03

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

 

17070๋ฒˆ: ํŒŒ์ดํ”„ ์˜ฎ๊ธฐ๊ธฐ 1

์œ ํ˜„์ด๊ฐ€ ์ƒˆ ์ง‘์œผ๋กœ ์ด์‚ฌํ–ˆ๋‹ค. ์ƒˆ ์ง‘์˜ ํฌ๊ธฐ๋Š” N×N์˜ ๊ฒฉ์žํŒ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , 1×1ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นธ์€ (r, c)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ r์€ ํ–‰์˜ ๋ฒˆํ˜ธ, c๋Š” ์—ด์˜

www.acmicpc.net

 

ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ 

dfs๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , ์ฒ˜์Œ์— ๊ตฌ์ƒํ•œ๋Œ€๋กœ ์ž˜ ํ’€๋ ค์„œ ๊ธฐ๋ถ„ ์ข‹์•˜๋˜ ๋ฌธ์ œ.

์ขŒํ‘œ๋ฅผ i, j ๊ฐ’ ๋”ฐ๋กœ ๋„˜๊ธฐ์ง€ ์•Š๊ณ  new int[]{i,j} ํ˜•ํƒœ๋กœ ํฌ๊ธฐ 2์งœ๋ฆฌ int๋ฐฐ์—ด ์ขŒํ‘œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋„˜๊ฒผ๋”๋‹ˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—„์ฒญ ์‚ฌ์šฉํ–ˆ๋‹ค. 


์ •๋‹ต์ฝ”๋“œ

์šฐ์„  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—„์ฒญ ์žก์•„๋จน์€ ์ฝ”๋“œ ๋จผ์ € ๋ณด๊ฒ ๋‹ค. ๊ทผ๋ฐ ์‚ฌ์‹ค new int[]{i, j} ์ฝ”๋“œ๋ฅผ ๊ทธ๋ƒฅ ๋ถ„๋ฆฌ์‹œํ‚จ๊ฑฐ๋ผ์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•ด์•ผ๋  ์ค„ ์•Œ๊ณ  visited๋„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์ด์ „์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†์–ด์„œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋Š” ํ•„์š”ํ•˜์ง€์•Š์•˜๋‹ค. 

import java.util.*;
import java.io.*;

public class Main {
	static int n;
	static int[][] map;
	static boolean[][] v;
	static int find;
	static int state; // 0,1,2

	public static void dfs(int cs, int[] next) {
		int ci = next[0];
		int cj = next[1];
		if (ci == n - 1 && cj == n - 1) {
			find++;
			return;
		}
		if (cs == 0) {// ์ด์ „ ์ƒํƒœ๊ฐ€ ๊ฐ€๋กœ. ๋‹ค์Œ๊ธธ์€ 0,1 ๋งŒ ๋ณด๋ฉด๋จ.
			// 0
			if (cj < n - 1 && map[ci][cj + 1] == 0) {
				dfs(0, new int[] { ci, cj + 1 });
			}
			// 1
			if (cj < n - 1 && ci < n - 1 && map[ci + 1][cj + 1] == 0 && map[ci][cj + 1] == 0 && map[ci + 1][cj] == 0) {
				dfs(1, new int[] { ci + 1, cj + 1 });
			}
		}
		if (cs == 1) {// ๋‹ค์Œ๊ธธ์€ 0,1,2 ๋ณด๋ฉด๋จ.
			// 0
			if (cj < n - 1 && map[ci][cj + 1] == 0) {
				dfs(0, new int[] { ci, cj + 1 });
			}
			// 1
			if (cj < n - 1 && ci < n - 1 && map[ci + 1][cj + 1] == 0 && map[ci][cj + 1] == 0 && map[ci + 1][cj] == 0) {
				dfs(1, new int[] { ci + 1, cj + 1 });
			}
			// 2
			if (ci < n - 1 && map[ci + 1][cj] == 0) {
				dfs(2, new int[] { ci + 1, cj });
			}
		}
		if (cs == 2) {// ๋‹ค์Œ๊ธธ์€ 1,2 ๋ณด๋ฉด๋จ.
			// 1
			if (cj < n - 1 && ci < n - 1 && map[ci + 1][cj + 1] == 0 && map[ci][cj + 1] == 0 && map[ci + 1][cj] == 0) {
				dfs(1, new int[] { ci + 1, cj + 1 });
			}
			// 2
			if (ci < n - 1 && map[ci + 1][cj] == 0) {
				dfs(2, new int[] { ci + 1, cj });
			}
		}
	}

	public static void main(String[] args) throws Exception {
		// System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		map = new int[n][n];
		v = new boolean[n][n];
		find = 0;
		state = 0; // 0,1,2 -> ๊ฐ€๋กœ ๋Œ€๊ฐ ์„ธ๋กœ
		StringTokenizer st = null;
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < n; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		// 0,0 ์ด๋ž‘ 0,1 ์€ ์ด๋ฏธ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ๋œ๊ฑฐ๊ณ  ์‹œ์ž‘์ง€์ ์ด 0,1๋ถ€ํ„ฐ
		v[0][0] = true;
		v[0][1] = true;
		dfs(0, new int[] { 0, 1 });
		System.out.println(find);
	}
}

 

๊ทธ๋ฆฌ๊ณ  ์ด ์ฝ”๋“œ๊ฐ€ ์ขŒํ‘œ๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚จ ์ฝ”๋“œ

import java.util.*;
import java.io.*;

public class Main {
    static int n;
    static int[][] map;
    static int find;

    public static void dfs(int ci, int cj, int cs) {
        if (ci == n - 1 && cj == n - 1) {
            find++;
            return;
        }

        if (cs == 0) {
            if (cj < n - 1 && map[ci][cj + 1] == 0) {
                dfs(ci, cj + 1, 0);
            }
            if (cj < n - 1 && ci < n - 1 && map[ci + 1][cj + 1] == 0 && map[ci][cj + 1] == 0 && map[ci + 1][cj] == 0) {
                dfs(ci + 1, cj + 1, 1);
            }
        } else if (cs == 1) {
            if (cj < n - 1 && map[ci][cj + 1] == 0) {
                dfs(ci, cj + 1, 0);
            }
            if (cj < n - 1 && ci < n - 1 && map[ci + 1][cj + 1] == 0 && map[ci][cj + 1] == 0 && map[ci + 1][cj] == 0) {
                dfs(ci + 1, cj + 1, 1);
            }
            if (ci < n - 1 && map[ci + 1][cj] == 0) {
                dfs(ci + 1, cj, 2);
            }
        } else if (cs == 2) {
            if (cj < n - 1 && ci < n - 1 && map[ci + 1][cj + 1] == 0 && map[ci][cj + 1] == 0 && map[ci + 1][cj] == 0) {
                dfs(ci + 1, cj + 1, 1);
            }
            if (ci < n - 1 && map[ci + 1][cj] == 0) {
                dfs(ci + 1, cj, 2);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        map = new int[n][n];
        find = 0;
        StringTokenizer st = null;
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j < n; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        dfs(0, 1, 0); // ์‹œ์ž‘ ์œ„์น˜ ์„ค์ •
        System.out.println(find);
    }
}
๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT