티스토리 뷰
#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 |
댓글