코드굽는 타자기

SWEA[1247] - 최적 경로 본문

알고리즘/완전탐색

SWEA[1247] - 최적 경로

bright-jun 2020. 2. 18. 23:24

링크

SWEA[1247]

문제설명

  • 조합, 완전탐색

문제풀이

  • 조합, 완전탐색

문제코드

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Solution {

    public static int length(int[] a, int[] b) {
        return Math.abs(a[0]-b[0])+Math.abs(a[1]-b[1]);
    }

    public static int Ans=Integer.MAX_VALUE;
    public static int Temp;
    public static int[][] rc;
    public static int[] work;
    public static int[] home;
    public static int N;

    public static int[] comb;

    public static void Simulation() {
        Temp=0;
        Temp+=length(work,rc[comb[0]]);
        for (int i = 0; i < N-1; i++) {
            Temp+=length(rc[comb[i]],rc[comb[i+1]]);
            if(Temp>Ans) {    //백트래킹?
                return;
            }
        }
        Temp+=length(rc[comb[N-1]],home);
        if(Ans>Temp) {
            int debug=0;
        }
        Ans = Math.min(Ans, Temp);
    }

    public static void Search(int cnt, int flag) {
        if(cnt==N) {
            //System.out.println(Arrays.toString(comb));
            Simulation();
            return;
        }
        for (int i = 0; i < N; i++) {
//            겹치는게 없을 경우
            if((flag & 1<<i)==0) {
                comb[cnt]=i;
                Search(cnt+1,flag | 1<<i);
            }
        }
    }

    public static void main(String args[]) throws Exception
    {
        //System.setIn(new FileInputStream("res/swea/1247.txt"));

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int T = Integer.parseInt(br.readLine());

        for(int test_case = 1; test_case <= T; test_case++)
        {
            N = Integer.parseInt(br.readLine().trim());
            rc = new int[N][2];
            comb = new int[N];
            work = new int[2];
            home = new int[2];

            st = new StringTokenizer(br.readLine());
            work[0] = Integer.parseInt(st.nextToken());
            work[1] = Integer.parseInt(st.nextToken());
            home[0] = Integer.parseInt(st.nextToken());
            home[1] = Integer.parseInt(st.nextToken());
            for (int i = 0; i < N; i++) {
                rc[i][0] = Integer.parseInt(st.nextToken());
                rc[i][1] = Integer.parseInt(st.nextToken());
            }


            Search(0, 0);

            System.out.println("#"+test_case+" "+Ans);
//            초기화
            Ans=Integer.MAX_VALUE;
        }
    }
}

아쉬운점

  • 문제 잘못읽어서 인풋 제대로 못읽음 ㅡㅡ
    • 회사, 집, N개의 방문지 순서임...
    • N개의 방문지, 회사, 집 순서로 했었음
  • 백트래킹은 어떻게하는건지 모르겠음

잘한점

  • bit masking으로 조합 만듬
  • O(N) = 10! = 36만 완전탐색 가능

'알고리즘 > 완전탐색' 카테고리의 다른 글

SWEA[4012] - 요리사  (0) 2020.02.22
SWEA[4008] - 숫자 만들기  (0) 2020.02.20
SWEA[2806] - N-Queen[D3]  (0) 2020.02.18
SWEA[1952] - 수영장  (0) 2020.02.18
SWEA[2383] - 점심 식사시간  (0) 2020.02.18
Comments