๐SWEA_SW_1949
๐ [SW_1949] ๋ฑ์ฐ๋ก ์กฐ์ฑ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
static int dx[] = { 1, -1, 0, 0 };
static int dy[] = { 0, 0, 1, -1 };
static int[][] map;
static boolean[][] v;
static int N, K, res;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
// ํ
์ผ
int TC = Integer.parseInt(br.readLine());
for (int t = 1; t <= TC; t++) {
sb.append("#").append(t).append(" ");
st = new StringTokenizer(br.readLine(), " ");
// N๊ฐ์ ์ค
N = Integer.parseInt(st.nextToken());
// ๊ณต์ฌ ๊ฐ๋ฅ ๊น์ด K
K = Integer.parseInt(st.nextToken());
// ์ง๋ ์ ๋ณด
map = new int[N][N];
// ๋ฐฉ๋ฌธ ์ฌ๋ถ
v = new boolean[N][N];
// ์ด ๋ฑ์ฐ๋ก ๊ธธ์ด
res = 0;
// ์ง๋ ์
๋ ฅ
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());
}
}
// ์์ ํ์
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
// ์ ์ผ ๋์ ๋ด์ฐ๋ฆฌ ์ฐพ๊ธฐ
int highest = highest();
for (int k = 0; k <= K; k++) {
map[i][j] -= k;
// ๊ธธ ์ฐพ๊ธฐ
findRoad(highest);
// ๋ฐฑํธ๋ํน
map[i][j] += k;
}
}
}
sb.append(res).append("\n");
}
System.out.println(sb);
}
// ๊ฐ์ฅ ๋์ ๋ด์ฐ๋ฆฌ ์ฐพ๊ธฐ
static int highest() {
int top = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
// ์ ์ผ ๋์ ๋ด์ฐ๋ฆฌ ๋์ด ์ฐพ๊ธฐ
top = Math.max(top, map[i][j]);
}
}
return top;
}
// ๊ธธ ์ฐพ๊ธฐ
static void findRoad(int highest) {
// ์ ์ผ ๋์ ๋ด์ฐ๋ฆฌ๋ถํฐ ์์
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
// ์ ์ผ ๋์ ๋ด์ฐ๋ฆฌ ์ผ๋
if (map[i][j] == highest) {
init();
dfs(j, i, 1);
}
}
}
}
// dfs 4๋ฐฉํฅ ํ์
static void dfs(int x, int y, int val) {
// ์ต๋ ๋ฑ์ฐ๋ก
res = Math.max(res, val);
// 4๋ฐฉํฅ ํ์
int nx, ny;
for (int i = 0; i < 4; i++) {
nx = x + dx[i];
ny = y + dy[i];
// ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ, ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ
if (nx < 0 || ny < 0 || nx >= N || ny >= N || v[ny][nx])
continue;
// ์ด๋ ๊ฐ๋ฅ
if (map[y][x] > map[ny][nx]) {
// ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
v[ny][nx] = true;
// dfs ํธ์ถ
dfs(nx, ny, val + 1);
// ๋ฐฑํธ๋ํน
v[ny][nx] = false;
}
}
}
// ๋ฐฉ๋ฌธ ๋ฐฐ์ด ์ด๊ธฐํ
static void init() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
v[i][j] = false;
}
}
}
}
๐ค ๋์ ์๊ฐ
DFS + ์์ ํ์์ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ฒ์์ K๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋ ๊ณ ๋ฏผ์ ๋ง์ด ํ๋๋ฐ ๊ฒฐ๊ตญ N์ ํฌ๊ธฐ๊ฐ ๊ทธ๋ ๊ฒ ํฌ์ง ์๊ณ ๋ง์ ๊ฐ์ง์น๊ธฐ ์์
์ด ์๋ค๊ณ ์๊ฐํ์ฌ ์์ ํ์์ผ๋ก ํด๊ฒฐ์ ํ์๋ค.
์์ ํ์ ๋ง๊ณ ๋ ๊ฐ์ฅ ๋์ ๋ด์ฐ๋ฆฌ์์ -1 ๋ง ํด๊ฐ๋ฉฐ ์ฒดํฌํ๋ ํ์ด๋ ์๋๋ฐ ๊ทธ๊ฒ์ ์กฐ๊ธ ํท๊ฐ๋ ค์ ํด๋ด์ง ๋ชปํ๋ค.
๋ค์์ ๋ค์ ํ ๊ธฐํ๊ฐ ์์ผ๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํด ๋ณด์์ผ ๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ ์๊พธ 51 test case ์ค์ 50๊ฐ๋ง ๋ง์์ ๊ณ ์์ ํ๋๋ฐ ์ฝ๊ฐ ๋ฌธ์ ์์ ์๋ด๊ฐ ์ข ๋ถ์กฑํ ๊ฒ ๊ฐ๋ค..
๊ฐ์ฅ ๋์ ๋ด์ฐ๋ฆฌ์์ ์์ํด์ k์ฉ ๋นผ๊ฐ ๋ ๋ด์ฐ๋ฆฌ๋ฅผ ์ด๊ธฐํ ํ๋ฉด ์๋๋คโฆ ์ด๊ธฐํ ํ๋๊ฒ ๋ง๋ ์ค ์์๋๋ฐ โฆใ
ใ
์จ๋ DFS ์ ์์ ํ์์ ์ด์ฉํด ํ์ด๋ธ ๋ฌธ์ ์ด๋ค.