집 좌표에 대한 배열과 치킨 집에 대한 배열에 좌표값들을 넣습니다.
치킨 집에 대해서 M가지 조합을 이용해서 M개의 치킨집에 대한 모든 경우를 탐색합니다.
탐색된 치킨집들로 도시의치킨 거리를 구해서 가장 작은 도시의 치킨 거리를 구하였습니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int n;
static int m;
static int ans = 987654321;
static int[][] map;
static Pair[] chicken;
static Pair[] house;
static int cCnt;
static int hCnt;
static boolean[] visit;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][n];
cCnt = 0;
hCnt = 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());
if(map[i][j] == 1) {
++hCnt;
} else if(map[i][j] == 2) {
++cCnt;
}
}
}
chicken = new Pair[cCnt];
house = new Pair[hCnt];
visit = new boolean[cCnt];
cCnt = 0;
hCnt = 0;
Pair p;
for(int i=0; i<n; ++i) {
for(int j=0; j<n; ++j) {
if(map[i][j] == 1) {
p = new Pair(i, j);
house[hCnt] = p;
++hCnt;
} else if (map[i][j] == 2) {
p = new Pair(i, j);
chicken[cCnt] = p;
++cCnt;
}
}
}
for(int i=0; i<cCnt; ++i) {
visit[i] = true;
DFS(i, 1);
visit[i] = false;
}
System.out.println(ans);
}
static void DFS(int index, int cnt) {
if(cnt == m) {
int totalDist = 0;
for(int i=0; i<house.length; ++i) {
int cthDist = 987654321;
for(int j=0; j<chicken.length; ++j) {
int num = 0;
if(visit[j]) {
num += Math.abs(house[i].y - chicken[j].y);
num += Math.abs(house[i].x - chicken[j].x);
cthDist = Math.min(cthDist, num);
}
}
totalDist += cthDist;
}
ans = Math.min(ans, totalDist);
}
for(int i=index+1; i<cCnt; ++i) {
visit[i] = true;
DFS(i, cnt + 1);
visit[i] = false;
}
}
static class Pair{
public int y, x;
Pair(int y, int x){
this.y = y;
this.x = x;
}
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int n;
static int m;
static int ans = 987654321;
static int[][] map;
static Pair[] chicken;
static Pair[] house;
static int cCnt;
static int hCnt;
static boolean[] visit;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][n];
cCnt = 0;
hCnt = 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());
if(map[i][j] == 1) {
++hCnt;
} else if(map[i][j] == 2) {
++cCnt;
}
}
}
chicken = new Pair[cCnt];
house = new Pair[hCnt];
visit = new boolean[cCnt];
cCnt = 0;
hCnt = 0;
Pair p;
for(int i=0; i<n; ++i) {
for(int j=0; j<n; ++j) {
if(map[i][j] == 1) {
p = new Pair(i, j);
house[hCnt] = p;
++hCnt;
} else if (map[i][j] == 2) {
p = new Pair(i, j);
chicken[cCnt] = p;
++cCnt;
}
}
}
for(int i=0; i<cCnt; ++i) {
visit[i] = true;
DFS(i, 1);
visit[i] = false;
}
System.out.println(ans);
}
static void DFS(int index, int cnt) {
if(cnt == m) {
int totalDist = 0;
for(int i=0; i<house.length; ++i) {
int cthDist = 987654321;
for(int j=0; j<chicken.length; ++j) {
int num = 0;
if(visit[j]) {
num += Math.abs(house[i].y - chicken[j].y);
num += Math.abs(house[i].x - chicken[j].x);
cthDist = Math.min(cthDist, num);
}
}
totalDist += cthDist;
}
ans = Math.min(ans, totalDist);
}
for(int i=index+1; i<cCnt; ++i) {
visit[i] = true;
DFS(i, cnt + 1);
visit[i] = false;
}
}
static class Pair{
public int y, x;
Pair(int y, int x){
this.y = y;
this.x = x;
}
}
}
'알고리즘' 카테고리의 다른 글
[Java] 백준 13459번 구슬 탈출 (0) | 2023.02.07 |
---|---|
[Java] 백준 1244번 스위치 켜고 끄기 (0) | 2023.02.07 |
[Java] 백준 13460번 구슬 탈출 2 (0) | 2023.02.06 |
[Java] 백준 19237번 어른 상어 (0) | 2023.02.06 |
[Java] 백준 19236번 청소년 상어 (0) | 2023.02.03 |