๐ท๐ผ๋ชจ์ฌ๋ด์ ๊ฐ๋ฐ์์ฒ๐ท๐ผ
[JAVA/์ฝ๋ฉํ ์คํธ] ํผ์ ๋ฐฐ๋ฌ ๊ฑฐ๋ฆฌ(์ผ์ฑ SW์ญ๋ํ๊ฐ ๊ธฐ์ถ๋ฌธ์ : DFSํ์ฉ) ๋ณธ๋ฌธ
[JAVA/์ฝ๋ฉํ ์คํธ] ํผ์ ๋ฐฐ๋ฌ ๊ฑฐ๋ฆฌ(์ผ์ฑ SW์ญ๋ํ๊ฐ ๊ธฐ์ถ๋ฌธ์ : DFSํ์ฉ)
์์ผ์ด 2022. 3. 22. 22:55์ค๋ช
N×N ํฌ๊ธฐ์ ๋์์ง๋๊ฐ ์์ต๋๋ค. ๋์์ง๋๋ 1×1ํฌ๊ธฐ์ ๊ฒฉ์์นธ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
๊ฐ ๊ฒฉ์์นธ์๋ 0์ ๋น์นธ, 1์ ์ง, 2๋ ํผ์์ง์ผ๋ก ํํ๋ฉ๋๋ค. ๊ฐ ๊ฒฉ์์นธ์ ์ขํ(ํ๋ฒํธ, ์ด ๋ฒํธ)๋ก ํํ๋ฉ๋๋ค.
ํ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ด๊ณ , ์ด ๋ฒํธ๋ 1๋ถํฐ N๊น์ง์ ๋๋ค.
๋์์๋ ๊ฐ ์ง๋ง๋ค “ํผ์๋ฐฐ๋ฌ๊ฑฐ๋ฆฌ”๊ฐ ์๋๋ฐ ๊ฐ ์ง์ ํผ์๋ฐฐ๋ฌ๊ฑฐ๋ฆฌ๋ ํด๋น ์ง๊ณผ ๋์์ ์กด์ฌํ๋
ํผ์์ง๋ค๊ณผ์ ๊ฑฐ๋ฆฌ ์ค ์ต์๊ฐ์ ํด๋น ์ง์ “ํผ์๋ฐฐ๋ฌ๊ฑฐ๋ฆฌ”๋ผ๊ณ ํ๋ค.
์ง๊ณผ ํผ์์ง์ ํผ์๋ฐฐ๋ฌ๊ฑฐ๋ฆฌ๋ |x1-x2|+|y1-y2| ์ด๋ค.
์๋ฅผ ๋ค์ด, ๋์์ ์ง๋๊ฐ ์๋์ ๊ฐ๋ค๋ฉด
(1, 2)์ ์๋ ์ง๊ณผ (2, 3)์ ์๋ ํผ์์ง๊ณผ์ ํผ์ ๋ฐฐ๋ฌ ๊ฑฐ๋ฆฌ๋ |1-2| + |2-3| = 2๊ฐ ๋๋ค.
์ต๊ทผ ๋์๊ฐ ๋ถ๊ฒฝ๊ธฐ์ ์ ์ด๋ค์ด ์ฐํ์ฃฝ์ ์๊ฒผ๋ ํผ์์ง๋ค์ด ํ์ฐํ๊ณ ์์ต๋๋ค.
๋์ ์์ฅ์ ๋์์ ์๋ ํผ์์ง ์ค M๊ฐ๋ง ์ด๋ฆฌ๊ณ ๋๋จธ์ง๋ ๋ณด์กฐ๊ธ์ ์ฃผ๊ณ ํ์ ์ํค๋ ค๊ณ ํฉ๋๋ค.
์์ฅ์ ์ด๋ฆฌ๊ณ ์ ํ๋ ํผ์์ง M๊ฐ๋ฅผ ์ ํํ๋ ๊ธฐ์ค์ผ๋ก ๋์์ ํผ์๋ฐฐ๋ฌ๊ฑฐ๋ฆฌ๊ฐ ์ต์๊ฐ ๋๋ M๊ฐ์ ํผ์์ง์ ์ ํํ๋ ค๊ณ ํฉ๋๋ค.
๋์์ ํผ์ ๋ฐฐ๋ฌ ๊ฑฐ๋ฆฌ๋ ๊ฐ ์ง๋ค์ ํผ์ ๋ฐฐ๋ฌ ๊ฑฐ๋ฆฌ๋ฅผ ํฉํ ๊ฒ์ ๋งํฉ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(2 ≤ N ≤ 50)๊ณผ M(1 ≤ M ≤ 12)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ ๋์ ์ ๋ณด๊ฐ ์ ๋ ฅ๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ M๊ฐ์ ํผ์์ง์ด ์ ํ๋์์ ๋ ๋์์ ์ต์ ํผ์๋ฐฐ๋ฌ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
4 4
0 1 2 0
1 0 2 1
0 2 1 2
2 0 1 2
์์ ์ถ๋ ฅ 1
6
import java.util.*;
class Point{
int x, y;
public Point(int tmpX, int tmpY) {
this.x = tmpX;
this.y = tmpY;
}
}
public class Main {
static int n, m;
static int[] dis;
static ArrayList<Point> hs = new ArrayList<>();
static ArrayList<Point> pz = new ArrayList<>();
static int answer = Integer.MAX_VALUE;
public void DFS(int L, int S){
if(L == m){
int sum = 0;
for(int i=0; i<hs.size(); i++){
int tmpSum = Integer.MAX_VALUE;
for(int j=0; j<m; j++){
int tmp = Math.abs(hs.get(i).x - pz.get(dis[j]).x) + Math.abs(hs.get(i).y - pz.get(dis[j]).y);
tmpSum = Math.min(tmpSum, tmp);
}
sum += tmpSum;
}
answer = Math.min(answer, sum);
}else{
for(int i=S; i<pz.size(); i++){
dis[L] = i;
DFS(L+1, i+1);
}
}
}
public static void main(String[] args) {
Main main = new Main();
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
int tmp = in.nextInt();
if(tmp == 1){
hs.add(new Point(i, j));
}else if(tmp == 2){
pz.add(new Point(i, j));
}
}
}
dis = new int[m];
main.DFS(0,0);
System.out.println(answer);
}
}
'๊ฐ๋ฐ > ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA/์ฝ๋ฉํ ์คํธ] ๋๋ค๋ฆฌ ๊ฑด๋๊ธฐ (0) | 2022.07.05 |
---|---|
[JAVA/์ฝ๋ฉํ ์คํธ] ๊ณ๋จ์ค๋ฅด๊ธฐ (0) | 2022.07.05 |
[JAVA/์ฝ๋ฉํ ์คํธ] ์ฌ๋๋ผ ์์ผ๋๋ (0) | 2022.03.22 |
[JAVA/์ฝ๋ฉํ ์คํธ] ํ ๋งํ (BFS ํ์ฉ) (0) | 2022.03.18 |
[JAVA/์ฝ๋ฉํ ์คํธ] ๋ฏธ๋ก์ ์ต๋จ๊ฑฐ๋ฆฌ ํต๋ก(BFS) (0) | 2022.03.18 |