개발/알고리즘

[dfs] maze (최단 거리 찾기)

재근이 2015. 1. 23. 04:58
반응형

프로그램 명: maze
제한시간: 1 초

도적들로부터 값진 보물을 훔쳐 달아나던 알리바바는 한 도시에 이르렀다. 그 도시는 전체가 마치 미로처럼 되어 있는 도시였는데 그 도시 한 쪽 끝에는 미리 준비해 놓은 배가 있어,도시 끝까지만 다다르면 도적들을 따돌릴 수 있다. 그런데 도적들은 이 도시에 대하여 잘아고 있기 때문에 도적들보다 먼저 출구에 다다르기 위해서는반드시 최단거리를 갖는 길로 가야만 한다.

도시의 지도가 주어질 때 최단 거리의 길을 찾는 프로그램을 작성하시오. 예를들어 도시의모양이 위와 같을 경우 입구에서 오른쪽으로 갈 경우 총 9 개의 블록(하얀 블록의 개수)를 지나 출구에 다다를 수 있다.

입력 형식

첫째 줄에 미로의 세로의 크기와 가로의 크기를 나타내는 자연수 N 과 M 이 이 주어지고 다음 N 줄에는 미로의 상태를 나타내는 M 개의 정수가 주어진다. 길은 0 으로 막힌 곳은 1 로 표시되며 모든 정보는 빈 칸 없이 붙어 있다. 입구는 항상 왼쪽 제일 아래 이고, 출구는 항상 오른쪽 제일 위이다. N 과 M 은 20 이하의 자연수이다.

출력 형식

첫 줄에 최단 거리의 길로 갈 경우 거쳐야 하는 블록의 개수를 출력한다. 만약 출구에 이르는 길이 없다면 -1 을 출력한다.

입출력 예

입력 

5 5
00110
00010
00110
00000
01011

출력

9
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
#include <stdio.h>
 
#define MAX 25
 
int Min=MAX*MAX;
int N, M;
char Map[MAX][MAX];
int Visit[MAX][MAX];
int Dir[4][2] = {{01}, {10}, {0, -1}, {-10}};
void input()
{
    int i, j;
    scanf("%d %d", &N, &M);    //N세로 M가로
    for(i=0; i<N; i++)
    {
        scanf("%s", Map[i]);
    }
}
 
void dfs(int y, int x, int depth)
{
    int i, j;
    int wX, wY;
    if(x<0 || y<0 || y>=N || x>=M)    //맵의 범위를 벗어 날때
        return;
    if(y == 0 && x == M-1)    //도착할때
    {
        if(depth < Min)
            Min = depth;
        return;
    }
 
    for(i=0; i<4; i++)
    {
        wX = x + Dir[i][0],
        wY = y + Dir[i][1];
        if(Visit[wY][wX] == 0 && Map[wY][wX] == '0')
        {
            Visit[wY][wX]  = 1;
            
            dfs(wY, wX, depth+1);
            Visit[wY][wX]  = 0;
        }
    }
}
 
int main(void)
{
    input();
    dfs(N-101);
    if(Min == 0)
        printf("%-1\n");
    else
        printf("%d\n", Min);
    return 0;
}
cs


반응형

'개발 > 알고리즘' 카테고리의 다른 글

[greedy method] 스노보드/snowboard  (0) 2015.02.12
[bfs] dam  (0) 2015.02.06
[backtracking] eating_puzzle  (0) 2015.01.23
[재귀] upstair  (0) 2015.01.23
[dfs] orders (알파벳 사전식 정렬)  (0) 2015.01.23