1767 프로세서 연결하기


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
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
#include <stdio.h>
#include <algorithm>
#include <vector>
#define P pair<int,int>
using namespace std;
 
int map[12][12];
int t, n, res, pnum;
 
//0동,1남,2서,3북
//라인 놓을 수 있는지 체크
bool isLine(int x,int y,int dir) {
    if (dir == 0) {
        for (int i = y + 1; i < n; i++) {
            if (map[x][i] != 0)return false;
        }
    }
    else if (dir == 1) {
        for (int i = x + 1; i < n; i++) {
            if (map[i][y] != 0)return false;
        }
    }
    else if (dir == 2) {
        for (int i = 0; i < y; i++) {
            if (map[x][i] != 0)return false;
        }
    }
    else {
        for (int i = 0; i < x; i++) {
            if (map[i][y] != 0return false;
        }
    }
    return true;
}
 
int drawLine(int x,int y,int dir,int flag) {
    int ans=0;
    if (dir == 0) {
        for (int i = y + 1; i < n; i++) {
            map[x][i] = (flag==0)?2:0;
            ans++;
        }
    }
    else if (dir == 1) {
        for (int i = x + 1; i < n; i++) {
            map[i][y] = (flag == 0) ? 2 : 0;
            ans++;
        }
    }
    else if (dir == 2) {
        for (int i = 0; i < y; i++) {
            map[x][i] = (flag == 0) ? 2 : 0;
            ans++;
        }
    }
    else {
        for (int i = 0; i < x; i++) {
            map[i][y] = (flag == 0) ? 2 : 0;
            ans++;
        }
    }
    return ans;
}
 
//라인 그리거나 삭제하고 라인 수 반환
void dfs(vector<P> &v, int idx, int num,int line) {
    if (idx == v.size()) {
        // 최대프로세서 갯수가 갱신되는 경우
        if (pnum < num) {
            res = line;
            pnum = num;
        }
        // 최대프로세서 갯수가 같은 경우
        else if (pnum == num) {
            if (res > line) res = line;
        }
    }
    else {
        // 4방향에대해 라인놓기 시도 + 라인 놓지않고 다음 프로세서로 넘어가는 경우
        // 총 5가지에 대해 탐색
        for (int i = 0; i < 4; i++) {
            if (isLine(v[idx].first, v[idx].second, i)) {
                dfs(v, idx + 1, num + 1,line + drawLine(v[idx].first, v[idx].second, i, 0));
                drawLine(v[idx].first, v[idx].second, i, 1);
            }
        }
        dfs(v, idx + 1, num, line);
    }
}
 
int main() {
    scanf("%d"&t);
    for (int tc = 1; tc <= t; tc++) {
        vector<P> v;
        scanf("%d"&n);
 
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d"&map[i][j]);
                if (i == 0 || j == 0 || i == n - 1 || j == n - 1continue;
                //프로세서 벡터에 추가하기
                if (map[i][j] == 1) {
                    v.push_back(P(i, j));
                }
            }
        }
 
        res = 987654321;
        pnum = 0;
        dfs(v, 000);
        printf("#%d %d\n",tc, res);
    }
}
cs


'SWEA::문제풀이' 카테고리의 다른 글

1252 하나로  (0) 2018.02.25
3143 가장 빠른 문자열 타이핑  (0) 2018.02.24
3349 최솟값으로 이동하기  (0) 2018.02.23
1868 파핑파핑 지뢰찾기  (0) 2018.02.22
3282 0/1 Knapsack  (0) 2018.02.18

+ Recent posts