알고리즘/softeer
함께하는 효도
베리영young
2024. 8. 28. 13:59
사용 알고리즘: dfs, bfs
사용 언어: java
import java.io.*;
import java.util.*;
public class Main {
static int n,m,map[][],friends[][], answer;
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
public static void main(String[] args) {
init();
boolean[][] visit = new boolean[n][n];
for(int i=0; i<m; i++) {
visit[friends[i][0]][friends[i][1]] = true;
} //시작점은 방문 처리
dfs(0, visit); //num번째 친구, 수확량더해야하는-, 처음 합계
System.out.println(answer);
}
static void dfs(int num, boolean[][] visit) {
if(num == m) {
int sum = 0;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(visit[i][j]) sum += map[i][j];
}
}
answer = Math.max(answer, sum);
return;
}
Queue<Work> q = new ArrayDeque<>();
q.add(new Work(new int[] {friends[num][0], friends[num][1]}, visit, 0));
while(!q.isEmpty()) {
Work work = q.poll();
int x = work.point[0];
int y = work.point[1];
boolean[][] visited = work.visit;
int move = work.move;
if(move > 2) {
dfs(num + 1, visited);
continue;
}
for(int d=0; d<4; d++) {
int nx = x + dx[d];
int ny = y + dy[d];
if(nx>=0&&nx<n && ny>=0&&ny<n) {
if(!visited[nx][ny]) {
boolean[][] visit2 = copyVisit(visited);
visit2[nx][ny] = true;
q.add(new Work(new int[] {nx, ny}, visit2, move + 1));
}
}
}
}
}
static boolean[][] copyVisit(boolean[][] visit) {
boolean[][] visit2 = new boolean[n][n];
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
visit2[i][j] = visit[i][j];
}
}
return visit2;
}
static void init() {
Scanner sc = new Scanner(System.in);
n = sc.nextInt(); //맵의 크기
m = sc.nextInt(); //친구 수
map = new int[n][n];
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
map[i][j] = sc.nextInt(); //열매열매
}
}
//
friends = new int[m][2];
for(int i=0; i<m; i++) {
friends[i][0] = sc.nextInt() - 1;
friends[i][1] = sc.nextInt() - 1;
}
}
}
class Work {
int[] point;
boolean[][] visit;
int move;
public Work(int[] point, boolean[][] visit, int move) {
this.point = point;
this.visit = visit;
this.move = move;
}
}
키야~~
dfs에 bfs를 섞을 생각은 우째 했으까
dfs만 쓰려다가 메모리 초과 날 거 같아서 머리 좀 써봤다 이거야