기술 블로그

1574번 룩 어택 본문

알고리즘 문제/BOJ

1574번 룩 어택

parkit 2019. 1. 3. 20:13
728x90
반응형

https://www.acmicpc.net/problem/1574


백트래킹 문제인줄 알았다.


이분 매칭 문제인데, 관련 문제들을 더 풀어 봐야겠다.


예제)

3 3 6

1 1

2 1

2 2

3 1

3 2

3 3


v[1] = {2, 3}

v[2] = {3}


행  열

1    2

2    3



이런 식으로 그림을 그려 보면서, 생각하면 된다. 이분 매칭.




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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
#include <map>
 
using namespace std;
 
#define MAX 500
 
int R = 0, C = 0, N = 0;
 
int Map[MAX][MAX] = { 0, };
 
int row[MAX][MAX] = { 0, }; // 이름을 헷갈리면 안 된다.
int col[MAX][MAX] = { 0, }; // 이름을 헷갈리면 안 된다.
 
int Left[MAX] = { 0, };
int Right[MAX] = { 0, };
 
bool visit[MAX] = { false, };
 
vector<int> v[MAX];
 
bool DFS(int start)
{
    if (visit[start]) return false;
 
    visit[start] = true;
 
    for (auto next : v[start])
    {
        if (Right[next] == -1 || DFS(Right[next]))
        {
            Left[start] = next;
            Right[next] = start;
 
            return true;
        }
    }
 
    return false;
}
 
int bm()
{
    fill(Left, Left + MAX, -1);
    fill(Right, Right + MAX, -1);
 
    int ret = 0;
 
    // R을 '행'으로 보면 안 된다.
    for (int i = 1; i <= R; i++)
    {
        memset(visit, falsesizeof(visit));
 
        if (DFS(i)) ++ret;
    }
 
    return ret;
}
 
int main(void)
{
    for (int i = 0; i < MAX; i++for (int j = 0; j < MAX; j++) Map[i][j] = 1;
 
    scanf("%d %d %d"&R, &C, &N);
 
    int y = 0, x = 0;
 
    for (int i = 0; i < N; i++)
    {
        scanf("%d %d"&y, &x);
 
        Map[y][x] = 0// 빈 칸에는 룩을 둘 수 없다.
    }
 
    int cnt = 1;
 
    // 행 기준 넘버링
    for (int i = 1; i <= R; i++)
    {
        for (int j = 1; j <= C; j++)
        {
            row[i][j] = cnt;
        }
 
        ++cnt;
    }
 
    cnt = 1;
 
    // 열 기준 넘버링
    for (int j = 1; j <= C; j++// 인덱스 조심
    {
        for (int i = 1; i <= R; i++)
        {
            col[i][j] = cnt;
        }
 
        ++cnt;
    }
 
    int r = 0, c = 0;
 
    for (int i = 1; i <= R; i++)
    {
        for (int j = 1; j <= C; j++)
        {
            if (Map[i][j] == 1)
            {
                v[row[i][j]].push_back(col[i][j]);
 
                r = max(r, row[i][j]);
                c = max(c, col[i][j]);
            }
        }
    }
    
    // R과 C로 보면 안 된다.
    R = r;
    C = c;
 
    printf("%d\n", bm());
 
    return 0;
}
cs


728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

16726번 영과일 학회방  (0) 2019.01.04
1014번 컨닝  (0) 2019.01.03
4991번 로봇 청소기  (0) 2019.01.03
16719번 ZOAC  (0) 2019.01.02
1764번 듣보잡  (0) 2019.01.02