λ°±μ€ 1987λ² - μνλ²³
https://www.acmicpc.net/problem/1987
1987λ²: μνλ²³
μΈλ‘ RμΉΈ, κ°λ‘ CμΉΈμΌλ‘ λ ν λͺ¨μμ 보λκ° μλ€. 보λμ κ° μΉΈμλ λλ¬Έμ μνλ²³μ΄ νλμ© μ ν μκ³ , μ’μΈ‘ μλ¨ μΉΈ (1ν 1μ΄) μλ λ§μ΄ λμ¬ μλ€. λ§μ μνμ’μ°λ‘ μΈμ ν λ€ μΉΈ μ€μ ν μΉΈμΌ
www.acmicpc.net
1λ μ μ νμμΌλ λͺ¨λ ν μ€νΈ μΌμ΄μ€λ₯Ό ν΅κ³Όνμ§ λͺ»νμ¬ μ€ν¨λ‘ λ¨μμλ λ¬Έμ μ΄λ€. λ€μ νμλλ°λ κ°μ λ‘μ§μΌλ‘ μ΄ν΄νκ³ νκ² λλ€. λΆλͺ λ§λ κ² κ°μλ° μλλκΉ λ΅λ΅ν΄μ κ²°κ΅ μ λ΅ μ½λμ κ³μ λΉκ΅ν λμ μ λ΅μ λμΆν΄λΌ μ μμλ€.
μ½λ - μ€ν¨
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
static int R, C;
static char[][] graph;
static boolean[][] visited;
static ArrayList<Character> letters;
static int count;
static int max= 0;
static int[] dx = {1, -1, 0, 0};
static int[] dy = {0, 0, 1, -1};
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
R = Integer.parseInt(input[0]);
C = Integer.parseInt(input[1]);
graph = new char[R + 1][C + 1];
visited = new boolean[R + 1][C + 1];
for(int i = 1; i <= R; i++) {
String row = br.readLine();
for(int j = 0; j < C; j++) {
graph[i][j + 1] = row.charAt(j);
}
}
letters = new ArrayList<Character>();
count = 1;
dfs(1, 1);
System.out.println(max);
}
private static void dfs(int v1, int v2) {
visited[v1][v2] = true; //μ μ λ°©λ¬Έ
letters.add(graph[v1][v2]);
for(int i = 0; i < 4; i++) { //μνμ’μ° νμ
int nx = v1 + dx[i];
int ny = v2 + dy[i];
if(1 <= nx && nx <= R && 1 <= ny && ny <= C) { //μ’ν λ²μ μμ μκ³
if(!letters.contains(graph[nx][ny]) && !visited[nx][ny]) { //μ§κΈκΉμ§ μ§λμ¨ μνλ²³κ³Ό λ€λ₯΄κ³ , λ°©λ¬ΈxλΌλ©΄
dfs(nx, ny); //νμ
count++;
}
}
}
visited[v1][v2] = false; //μ μ λ°©λ¬Έ μ΄κΈ°ν!!
max = Math.max(max, count);
}
}
μμ μ λ ₯ 3λ²μ΄ μλλ€.
5 5
IEFCJ
FHFKC
FFALF
HFGCF
HMCHH
λλ visited[x][y] λ°°μ΄μ μ¬μ©νμ¬ μ’νμ λ°©λ¬Έ μ€λ³΅μ λ§λλ‘ νμλ€. νμ§λ§ μ΄ λ¬Έμ μμλ μ’νμ λ°©λ¬Έ μ€λ³΅μ λ§λ κ²μ΄ μλλΌ, λ¬Έμμ μ€λ³΅μ λ§μμΌ νλ€. μ¦, μνλ²³λ§ λ€λ₯΄λ€λ©΄ μ΄μ μ λ°©λ¬Ένλ μ’νλ₯Ό νμ λ°©λ¬Έν΄λ λλ€.
λ°λΌμ λ¬Έμμ λ°©λ¬Έ μ¬λΆλ₯Ό 체ν¬ν 26μΉΈ μ§λ¦¬ λ°°μ΄μ λ§λ€μ΄μΌ νλ€. μμ€ν€ μ½λλ₯Ό μ°Έκ³ νμ¬ μΈλ±μ€λ λ¬Έμ - 'A'λ‘ ν΄μ€μΌ 0λ²λΆν° λ€μ΄κ°κ² λλ€.
κ·Έλ¦¬κ³ λ μ΄μ νμνμ§ λͺ»νλ©΄, ν¨μλ₯Ό λλ΄κΈ° μ μ λ¬Έμμ λ°©λ¬Έ μ¬λΆλ₯Ό false μ²λ¦¬ν΄μ€μΌ νλ€. κ·Έλ¦¬κ³ max κ°λ κ°±μ ν΄μ€λ€. (κ·Όλ° μ΄ λΆλΆμ΄ κ³μ μ¬κ·κ° μ’ λ£λ λλ§λ€ νΈμΆλλ€.. μ΄λ»κ² κ°μ ν μ μλ..?)
μ½λ - μ±κ³΅
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class b1987 {
static int R, C;
static char[][] graph;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static boolean[] alphabet;
static int count;
static int max;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
graph = new char[R + 1][C + 1];
for(int i = 1; i <= R; i++) {
String row = br.readLine();
for(int j = 1; j <= C; j++) {
graph[i][j] = row.charAt(j - 1);
}
}
alphabet = new boolean[26];
count = 1;
max = 0;
dfs(1, 1, 1);
System.out.println(max);
}
public static void dfs(int x, int y, int count) {
alphabet[graph[x][y] - 'A'] = true; //μνλ²³ μ€λ³΅ μλκ² μ²λ¦¬
for(int i = 0; i < 4; i++) { //μνμ’μ° νμ
int nx = x + dx[i];
int ny = y + dy[i];
if(1 <= nx && nx <= R && 1 <= ny && ny <= C) { //μ’ν λ²μ μμ μκ³
if(!alphabet[graph[nx][ny] - 'A']) { //μ§κΈκΉμ§ μ§λμ¨ μνλ²³κ³Ό λ€λ₯΄λ©΄
dfs(nx, ny, count + 1); //νμ
}
}
}
//νμ λλ¨
alphabet[graph[x][y] - 'A'] = false;
max = Math.max(max, count);
}
}