티스토리 뷰

#include <stdio.h>

int n, start;
int cost[10][10];
int visit[10];

int min(int a, int b)
{
    return a < b ? a : b;
}

int city(int cur, int visited)
{
    int i;
    int ret = 987654321;

    if (visited == n) {
        if (cost[cur][start] != 0) {
            ret = 0;
            ret += cost[cur][start];
            for (i = 0; i < n; i++) {
                if (i == start)
                    continue;
                ret += visit[i];
            }
        }
        return ret;
    }

    for (i = 0; i < n; i++) {
        if (visit[i] == 0 && cost[cur][i] != 0) {
            visit[i] = cost[cur][i];
            ret = min(ret, city(i, visited + 1));
            visit[i] = 0;
        }
    }
    return ret;
}

int main(void)
{
    int i, j;
    int result = 987654321;

    scanf("%d", &n);
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            scanf("%d", &cost[i][j]);
    for (i = 0; i < n; i++) {
        start = i;
        visit[start] = -1;
        result = min(result, city(start, 1));
        visit[start] = 0;
    }
    printf("%d", result);

    return 0;
}

디버깅이 한 시간쯤 걸렸다.
답을 (출발한 도시부터 마지막 도시까지 가는 거리) + (마지막 도시에서 출발한 도시까지 가는 거리) 이렇게 구했는데 한 예시에서 (마지막 도시에서 출발한 도시까지 가는 거리) 부분이 더해지지 않은 값이 답으로 나왔다.
사실 더해지지 않은 게 아니고 0을 더한 거다. 거리가 0이면 경로가 존재하지 않는 경우이므로 제외해야한다.
visited == n 일 때 조건을 추가하여 고쳤다.

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[BOJ] 14891 톱니바퀴  (0) 2020.05.20
[BOJ] 1107 리모컨  (0) 2020.05.20
[BOJ] 11051 이항 계수 2  (0) 2020.02.28
[BOJ] 11057 오르막 수  (0) 2020.02.27
[BOJ] 10844 쉬운 계단 수  (0) 2020.02.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함