https://www.acmicpc.net/problem/10971
풀이
경로를 탐색하는 탐색문제이다. 처음에 출발점이 안 주어져 있어서 모든 노드를 반복문으로 출발점으로 하여 탐색을 하였다. 그러나 문제에서는 마지막에 처음 출발한 경로로 다시 돌아와야 하기 때문에 모든 노드를 출발점으로 탐색할 필요가 없었다.
Ex)답이 1-2-3-4-1이라고 하면 나는
for(int i=1;i<=4;i++)
search();
이런식으로 모든 노드를 출발점으로 탐색하였는데 다시 원점으로 돌아오면서 하나의 loop처처럼 형성이되어 어느 출발점에서 출발해도 결국 답은 하나라는 것이다.
1-2-3-4-1
2-3-4-1-2
3-4-1-2-3
4-1-2-3-4
이런식으로 방문하는 순서만 달라지지 순서는 결국 동일하다.
따라서 출발점은 어디가 되었던지 모든 경로를 탐색하여 비용이 최소인 경로를 찾아 출력만 하면되는 문제이다.
답안 코드
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 32 33 34 35 36 37 38 | #include <stdio.h> int map[13][13], visit[11],min=2000000,N; //탐색함수. int search(int x,int total, int v) { if (x == 1 && v == N + 1) { if (total < min) min = total; return 0; } if (visit[x]) return 0; visit[x] = 1;//방문한 곳은 1로 for (int i = 1; i <= N; i++) { if (map[x][i]) { total += map[x][i];//비용을 더해준다. search(i,total,v+1);//재귀 total -= map[x][i];//다른 경로를 탐색을 위해 직전 비용을 - } } visit[x] = 0;//함수를 빠져나가면서 다시 0으로 return min; } int main() { scanf("%d",&N); for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) scanf("%d",&map[i][j]); printf("%d",search(1,0,1)); return 0; } | cs |
'SW 업무 관련 > 백준' 카테고리의 다른 글
[BAEKJOON] 1697_숨바꼭질_C언어 (418) | 2017.08.01 |
---|---|
[BAEKJOON] 9934_완전 이진 트리_C언어 (2) | 2017.08.01 |
[BEAKJOON] 1182_부분집합의 합_C언어 (0) | 2017.07.27 |
[BAEKJOON] 11723_집한_C언어 (0) | 2017.07.25 |
[BAEKJOON] 1406_에디터_C언어 (0) | 2017.07.17 |