[SWEA] Q3752 가능한 시험 점수

Question

Language: Python

Difficulty: D5

해당 문제에서는 효율성을 따지지 않기 때문에 모든 노드에 대한 방문을 수행해서 가장 짧은 거리를 구할 수 있다.

Solution 1

from math import inf

def dfs(count,visited,distance,current_location,house_coordinate):
    global min_distance
    if count==n:
        min_distance=min(min_distance,distance+abs(house_coordinate[0]-current_location[0])+abs(house_coordinate[1]-current_location[1]))
        return

    for i in range(n):
        if i not in visited:
            dfs(count+1,visited+[i],distance+abs(current_location[0]-coordinates[i][0])+abs(current_location[1]-coordinates[i][1]),coordinates[i],house_coordinate)

def solution():
    global coordinates,min_distance
    coordinates=[]
    min_distance=inf

    company_coordinate=locations[0],locations[1]
    house_coordinate = locations[2], locations[3]

    for i in range(2,n+2):
        coordinates.append((locations[i*2],locations[i*2+1]))

    dfs(0,[],0,company_coordinate,house_coordinate)

if __name__ == "__main__":
    n=0
    locations=[]
    coordinates=[]
    min_distance=inf
    with open("input.txt","r" ) as file:
        test_cases=int(file.readline())
        for case in range(test_cases):
            n=int(file.readline())
            locations=list(map(int,file.readline().split()))
            solution()
            print(f"#{case+1} {min_distance}")

하지만, 본래 이 문제의 유형은 2098 문제와 같은 TSP 문제이다.

Solution 2

from math import inf

def manhattan_distance(src,des):
    return abs(src[0]-des[0])+abs(src[1]-des[1])

def tsp(visited,index):
    #모든 노드를 다 거친 경우:
    if visited==(1<<n) -1:
        return manhattan_distance(coordinates[index],coordinates[-1])

    #처음 방문하는 경우가 아닌 경우
    if dp[index][visited] != inf:
        return dp[index][visited]

    #0번 노드는 회사로 다시는 접근할 일이 없다.
    for next_index in range(1,n+1):
        #방문하지 않은 경우에 대해서
        if 1 << (next_index-1) & visited ==0:
            dp[index][visited]=min(dp[index][visited],tsp(visited|1<<(next_index-1),next_index)+manhattan_distance(coordinates[index],coordinates[next_index]))

    return dp[index][visited]

def solution():
    global coordinates,dp
    coordinates=[]
    dp=[[inf] * (1<<n) for _ in range(n+1)]

    #회사의 위치
    coordinates.append((locations[0],locations[1]))

    #각각의 집에 대한 위치
    for i in range(2, n + 2):
        coordinates.append((locations[i * 2], locations[i * 2 + 1]))
    
    #집의 위치
    coordinates.append((locations[2], locations[3]))

    return tsp(0,0)

if __name__ == "__main__":
    n=0
    locations=[]
    coordinates=[]
    dp=[]
    with open("input.txt","r" ) as file:
        test_cases=int(file.readline())
        for case in range(test_cases):
            n=int(file.readline())
            locations=list(map(int,file.readline().split()))
            print(f"#{case+1} {solution()}")

댓글남기기