Quick actions

cmd+k|ctrl+k

Navigation

Languages

(백준) 다리 만들기 (BFS / DFS)

Snippet info

Language

C

Visibility

public

Author

kim112mgxld

Created

2020-08-21T03:18:16Z

Updated

2020-09-23T02:08:01Z

#include <stdio.h>
#define MAX 100
#define INFI 9999999

typedef struct _Pos {
    int x;
    int y;
    int c;
} Pos;

Pos pos[INFI];
int front = -1, rear = -1;

int number = 1;
int map[MAX][MAX];
int visited[MAX][MAX];

int px[] = {-1, 1, 0, 0};
int py[] = {0, 0, -1, 1};

void initVisitedMap () {
    for (int y = 0; y < MAX; y++) {
        for (int x = 0; x < MAX; x++) {
            visited[y][x] = 0;
        }
    }
}

void setLandNumber (int x, int y, int n, int limit) {
    map[y][x] = n;
    visited[y][x] = 1;
    
    for (int i = 0; i < 4; i++) {
        int newX = x + px[i];
        int newY = y + py[i];
        
        if (newX < 0 || newX >= limit || newY < 0 || newY >= limit) {
            continue;
        }
        
        if (!visited[newY][newX] && map[newY][newX] > 0) {
            setLandNumber(newX, newY, n, limit);
        }
    }
}

int getMinLandCost (int n, int limit) {
    int min = INFI;
    
    for (int y = 0; y < limit; y++) {
        for (int x = 0; x < limit; x++) {
            if (map[y][x] == n) {
                rear++;
                pos[rear].x = x;
                pos[rear].y = y;
                pos[rear].c = 0;
            }
        }
    }
    
    while (front < rear) {
        front++;
        int x = pos[front].x;
        int y = pos[front].y;
        int c = pos[front].c;
        
        for (int i = 0; i < 4; i++) {
            int newX = x + px[i];
            int newY = y + py[i];
            
            if (newX < 0 || newX >= limit || newY < 0 || newY >= limit) {
                continue;
            }
            
            if (map[newY][newX] != 0 && map[newY][newX] != n) {
                if (min > c) {
                    min = c;
                    break;
                }
            } else if (map[newY][newX] == 0 && !visited[newY][newX]) {
                rear++;
                pos[rear].x = newX;
                pos[rear].y = newY;
                pos[rear].c = newC + 1;
                
                visited[newY][newX] = 1;
            }
        }
    }
    
    return min;
}

int main(void) {
    int N = 0;
    int Min = INFI;
    
    scanf("%d", &N);
    
    for (int y = 0; y < N; y++) {
        for (int x = 0; x < N; x++) {
            scanf("%d", &map[y][x]);
        }
    }
    
    for (int y = 0; y < N; y++) {
        for (int x = 0; x < N; x++) {
            if (map[y][x] > 0 && !visited[y][x]) {
                setLandNumber(x, y, number, N);
                number++;
            }
        }
    }
    
    initVisitedMap();
    
    for (int i = 0; i < number; i++) {
        int minPath = getMinLandCost(i + 1, N);

        if (Min > minPath) {
            Min = minPath;
        }
        
        rear = -1;
        front = -1;
        
        initVisitedMap();
    }
    
    printf("%d\n", (Min == INFI) ? 0 : Min);
    
    return 0;
}
INFO